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

Asp.net mvc 在asp.net mvc中在全局变量中存储cookie值,asp.net-mvc,cookies,Asp.net Mvc,Cookies,我有一个ASP.NETMVC博客,为了在使用cookie的客户端时区中显示帖子和评论日期,cookie包含客户端时区偏移量。当服务器收到请求时,它将从cookie中读取偏移量值,并在发送到浏览器之前相应地更改所有日期。我的问题是如何在每次请求时将cookie存储在全局变量中,以便任何地方都可以访问它以进行日期调整。如果不想每次都使用cookie,可以使用会话变量 session["MyVarName"] = mycookievalue 然后,您可以在每次需要时访问会话 您还可以考虑实现e cu

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

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

session["MyVarName"] = mycookievalue
然后,您可以在每次需要时访问会话


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

一般来说,控制器和操作越依赖于外部提供的值,它们就越具有单元可测试性和健壮性。我会这样做的

首先,创建保存时区设置的模型

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中注册该模型绑定器

受保护的无效应用程序\u Start() { RegisterAllAreas()

}

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

public ActionResult ShowComments(ClientTimeZoneSettings settings)
{
  // use settings
}
更新:非常简单的方法:

从nuget安装。它包含
CookieValueProviderFactory
,在绑定模型时将自动检查Cookie中的值。要使用它,只需将其添加到
valueProviderFactorys

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();
}
public ActionResult ShowComments(string timeZoneName)
{
    // timeZoneName will contain your cookie value
    return View();
}