Как добавить cookie для каждого посетителя на мой сайт asp.net MVC? - PullRequest
4 голосов
/ 03 июня 2011

Я экспериментирую с сайтом ASP.NET MVC 3, используя бритву в качестве движка просмотра. Мне нужно назначить куки для каждого посетителя моего сайта. Каково было бы лучшее место / способ сделать это? Пожалуйста, уточните, потому что я очень новичок в ASP.NET.

Ответы [ 4 ]

9 голосов
/ 03 июня 2011

Есть 3 способа реализовать это без нарушения шаблона mvc:

1 - Базовый класс контроллера с заданным поведением в методе OnActionExecuting / OnActionExecuted / OnResultExecuting (если это поведение необходимо для всего веб-сайта)

2 - Создать фильтр действий с указанным поведением при OnActionExecuting / OnActionExecuted / OnResultExecuting методы:

public class MyCookieSettingFilterAttribute : ActionFilterAttribute 
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Cookies.Add(new HttpCookie(name, value));
    }
}

и

назначить атрибут фильтра некоторым контроллерам / действиям (если это поведение не обязательно для всех веб-сайтов), например

[MyCookieSettingFilter]
public class MyHomeController : Controller
{
}

или

public class MyAccountController : Controller
{
    [MyCookieSettingFilter]
    public ActionResult Login()
    {
    }
}

3 - Создать фильтр действий с заданным поведением в методах OnActionExecuting / OnActionExecuted / OnResultExecuting и зарегистрировать его в global.asax - он будет работать для всех действий всех контроллеров (если это поведение необходимо для всего сайта)

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
   filters.Add(new MyCookieSettingFilterAttribute());
}

Я не рекомендую использовать способ Base Controller, потому что он менее расширяемый, чем способ Global Filter. Используйте разные глобальные фильтры для обеспечения разных независимых глобальных поведений.

4 голосов
/ 03 июня 2011

Это будет работать независимо от того, на какую страницу впервые заходит пользователь.Вы можете наследовать ваши контроллеры с базовым контроллером, а затем добавить некоторую информацию в метод OnActionExecuting

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext context)
    {
        HttpCookie myCookie = Request.Cookies[keyOfSomeKind];

        if (myCookie == null)
        {
            HttpCookie newCookie
                = new HttpCookie(keyOfSomeKindy, "Some message");
            newCookie.Expires = DateTime.Now.AddMinutes(3);
            current.Response.Cookies.Add(newCookie);
        }

        base.OnActionExecuting(context);
    }
}
1 голос
/ 03 июня 2011

Установка cookie должна быть выполнена в вашем контроллере. Вы можете установить cookie следующим образом:

Response.Cookies.Add(new HttpCookie(cookieName, cookieValue));

Если вам нужно получить значение в вашем представлении, лучшим способом будет получить его в вашем контроллере и вставить его в модель представления или состояние представления:

var cookie = Response.Cookies[cookieName];
ViewData["CookieInfo"] = cookie.Value;

А по вашему мнению:

@ViewData["CookieInfo"]
1 голос
/ 03 июня 2011

У вас уже есть сеанс и файл cookie сеанса.

Но если вам нужно записать определенное значение в файл cookie, у вас есть доступ к потоку ответов из контроллера

this.Response.Cookies.Add(); внутриконтроллер (это не требуется)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...