在asp.net mvc中将cookie值存储在全局变量中

时间:2011-09-09 07:13:20

标签: asp.net-mvc cookies

我有一个ASP.NET MVC博客,为了在客户端时区显示帖子和评论日期,使用cookie,cookie包含客户端时区偏移量。当服务器收到请求时,它将从cookie中读取偏移值,并在发送到浏览器之前相应地更改所有日期。我的问题是如何将cookie存储在每个请求的全局变量中,以便日期调整的任何地方都可以访问它。

2 个答案:

答案 0 :(得分:1)

通常,控制器和动作越多,取决于从外部提供的值,它们的单元可测试性越强,越强大。我会这样做

首先,创建包含时区设置的模型

public class ClientTimeZoneSettings
{
   public string TimeZoneName {get; set;} // or whatever
}

然后,创建模型绑定器。该模型绑定器将用于从cookie中提取值

public class ClientTimeZoneSettingsModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (controllerContext.RequestContext.HttpContext.Request.Cookies.AllKeys.Contains("timeZoneName"))
        {
            bindingContext.Model = new ClientTimeZoneSettings {TimeZoneName = controllerContext.RequestContext.HttpContext.Request.Cookies["timeZoneName"]; }
        }

    }
}

在Global.asax中注册该模型绑定器

protected void Application_Start() {     AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);


ModelBinders.Binders.Add(typeof(ClientTimeZoneSettings), new ClientTimeZoneSettingsModelBinder());

}

主要观点。在您需要这些设置的所有操作中,您可以直接使用ClientTimeZoneSettings作为参数

public ActionResult ShowComments(ClientTimeZoneSettings settings)
{
  // use settings
}

更新:更简单的方法:

从nuget安装MvcFutures。它包含CookieValueProviderFactory,它会在模型​​绑定时自动检查cookie的值。要使用它,只需添加到ValueProviderFactories

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    ValueProviderFactories.Factories.Add(new CookieValueProviderFactory());
}

然后根据cookie名称命名您的参数

public ActionResult ShowComments(string timeZoneName)
{
    // timeZoneName will contain your cookie value
    return View();
}

答案 1 :(得分:0)

如果您不想每次都使用Cookie,则可以使用会话变量

session["MyVarName"] = mycookievalue

然后您可以在每次需要时访问该会话。

您还可以考虑实现e自定义模型绑定器,以便将会话的值绑定到模型。 (例如UserSettingsModel类)