/ / Съхраняване на стойността на бисквитките в глобалната променлива в asp.net mvc - asp.net-mvc, cookies

Съхраняване на стойността на бисквитките в глобална променлива в asp.net mvc - asp.net-mvc, cookies

Аз съм 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();
}