Как правило, чем больше контроллер и действие зависят от значений, поступающих извне, тем более надежными и проверяемыми они становятся.Я бы сделал это следующим образом:
Сначала создайте модель, которая содержит настройки для часового пояса
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
}
ОБНОВЛЕНИЕ: Значительно более простой подход:
Установить MvcFutures от nuget.Он содержит 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();
}