繁体   English   中英

如何为我的 asp.net MVC 站点的每个访问者添加 cookie?

[英]How do I add a cookie for every visitor to my asp.net MVC site?

我正在尝试使用 ASP.NET MVC 3 站点,使用 razor 作为视图引擎。 我需要为我网站的每个访问者分配一个 cookie。 这样做的最佳地点/方式是什么? 请详细说明,因为我是 ASP.NET 的新手。

有 3 种方法可以在不破坏 mvc 模式的情况下实现它:

1 - 基础 controller class 在OnActionExecuting / OnActionExecuted / OnResultExecuting方法中具有指定行为(如果此行为在整个 web 站点中是必需的)

2 - 在OnActionExecuting / OnActionExecuted / OnResultExecuting方法中创建具有指定行为的操作过滤器:

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

为某些控制器/操作分配过滤器属性(如果所有 web 站点都不需要此行为),例如

[MyCookieSettingFilter]
public class MyHomeController : Controller
{
}

或者

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

3 - 在OnActionExecuting / OnActionExecuted / OnResultExecuting方法中创建具有指定行为的操作过滤器,并将其注册到global.asax - 它适用于所有控制器的所有操作(如果所有 web 站点都需要此行为)

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

我不建议使用 Base Controller 方式,因为它的可扩展性不如全局过滤器方式。 使用不同的全局过滤器来提供不同的独立全局行为。

无论用户首先进入哪个页面,这都会起作用。 您可以使用基本 controller 继承您的控制器,然后将一些信息添加到 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);
    }
}

您已经拥有 session 和 session cookie。

但是,如果您需要将特定值写入 cookie,您可以访问来自 controller 的响应 stream

this.Response.Cookies.Add(); controller 内部(这不是必需的)

应该在 controller 中设置 cookie。 你可以像这样设置一个cookie:

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

如果您需要在视图中获取值,最好的方法是在 controller 中获取它并将其粘贴在视图 model 或视图状态中:

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

在您看来:

@ViewData["CookieInfo"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM