Аз съм ASP.NET MVC blog, за да се покажат датите и коментарите в часовата зона на клиента се използва бисквитка, бисквитката съдържа офсет на часовата зона на клиента. Когато сървърът получи заявка, той ще прочете стойността на отместването от „бисквитката“ и ще промени съответните дати, преди да ги изпрати в браузъра. Моят въпрос как мога да съхраня кукитата в глобална променлива при всяка заявка, така че да може да бъде достъпен от всяко място за корекция на датата.
Отговори:
0 за отговор № 1Можете да използвате променлива на сесията, ако не искате да използвате бисквитката всеки път
session["MyVarName"] = mycookievalue
след това можете да получите достъп до сесията всеки път, когато е необходимо.
Можете също така да мислите за внедряване на потребителски модел binder, така че да можете да обвържете стойността на сесията си към модел.
1 за отговор № 2
Като цяло, колкото повече контролер и действие зависят от стойности, доставени отвън, толкова повече тествани и стабилни са те. Ще го направя по този начин
Първо, създайте модел, който съдържа настройки за часовата зона
public class ClientTimeZoneSettings
{
public string TimeZoneName {get; set;} // or whatever
}
След това създайте модела за подвързване. Този моделен биндер ще се използва за извличане на стойности от „бисквитка“
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
защитен 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
}
UPDATE: Значително по-опростен подход:
Инсталирай MvcFutures от nuget. Съдържа CookieValueProviderFactory
която автоматично ще инспектира „бисквитките“ за стойности при свързване на модела. За да го използвате, просто добавете ValueProviderFactories
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ValueProviderFactories.Factories.Add(new CookieValueProviderFactory());
}
След това назовете параметъра, който съответства на името на бисквитката
public ActionResult ShowComments(string timeZoneName)
{
// timeZoneName will contain your cookie value
return View();
}