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