我正在尝试使用razor作为视图引擎的ASP.NET MVC 3站点。我需要为我网站的每个访问者分配一个cookie。这样做的最佳地点/方式是什么? 请详细说明,因为我是ASP.NET的新手。
答案 0 :(得分:9)
有三种方法可以在不破坏mvc模式的情况下实现它:
1 - 在OnActionExecuting
/ OnActionExecuted
/ OnResultExecuting
方法中具有指定行为的基本控制器类(如果整个网站上的此行为必要)< / p>
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方式的可扩展性差。使用不同的全局过滤器来提供不同的独立全局行为。
答案 1 :(得分:4)
无论用户最初使用哪个页面,这都可以使用。 您可以使用基本控制器继承控制器,然后将一些信息添加到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);
}
}
答案 2 :(得分:1)
您已拥有会话和会话Cookie。
但是如果你需要为cookie写一个特定的值,你就可以访问来自控制器的响应流
控制器内的 this.Response.Cookies.Add();
(这不是必需的)
答案 3 :(得分:1)
应在控制器中设置cookie。你可以这样设置一个cookie:
Response.Cookies.Add(new HttpCookie(cookieName, cookieValue));
如果您需要在视图中获取值,最好的方法是在控制器中获取它并将其粘贴到视图模型或视图状态中:
var cookie = Response.Cookies[cookieName];
ViewData["CookieInfo"] = cookie.Value;
在你看来:
@ViewData["CookieInfo"]