Создание Cookie ASP.NET и MVC

У меня довольно простая проблема - я хочу создать cookie на клиенте, который создается сервером. Я нашел много страниц, которые описывают, как его использовать, но я всегда придерживался одной и той же точки.

У меня есть DBController, который вызывается, когда есть запрос к БД.

Конструктор DBController выглядит следующим образом:

public class DBController : Controller
{
    public DBController()
    {
        HttpCookie StudentCookies = new HttpCookie("StudentCookies");
        StudentCookies.Value = "hallo";
        StudentCookies.Expires = DateTime.Now.AddHours(1);
        Response.Cookies.Add(StudentCookies);
        Response.Flush();
    }

    [... more code ...]

}

Я получаю сообщение об ошибке "Ссылка на объект не установлена на экземпляр объекта" по адресу:

StudentCookies.Expire = DateTime.Now.AddHours(1)

Это что-то вроде основного сообщения об ошибке - что за базовая вещь я забыл?

Ответ 1

Проблема в том, что вы не можете добавить ответ к конструктору контроллера. Объект Response не был создан, поэтому он получает нулевую ссылку, попробуйте добавить метод для добавления файла cookie и вызвать его в методе действия. Вот так:

private HttpCookie CreateStudentCookie()
{
    HttpCookie StudentCookies = new HttpCookie("StudentCookies");
    StudentCookies.Value = "hallo";
    StudentCookies.Expires = DateTime.Now.AddHours(1);
    return StudentCookies;
}

//some action method
Response.Cookies.Add(CreateStudentCookie());

Ответ 2

Используйте Response.SetCookie(), потому что Response.Cookie.Add() может добавить несколько файлов cookie, тогда как SetCookie() обновит существующий файл cookie. Поэтому я думаю, что ваша проблема может быть решена.

public DBController()
{
    HttpCookie StudentCookies = new HttpCookie("StudentCookies");
    StudentCookies.Value = "hallo";
    StudentCookies.Expires = DateTime.Now.AddHours(1);
    Response.SetCookie(StudentCookies);
    Response.Flush();
}

Ответ 3

Вместо конструктора можно использовать метод Initialize() контроллера. В функции инициализации доступен объект Request. Я подозреваю, что такое же действие можно предпринять с объектом Response.