Tengo un ASP.NET MVC blog, para mostrar las publicaciones y las fechas de comentarios en la zona horaria del cliente se utiliza una cookie, la cookie contiene el desplazamiento de la zona horaria del cliente. Cuando el servidor recibe una solicitud, leerá el valor de compensación de la cookie y cambiará todas las fechas en consecuencia antes de enviarlo al navegador. Mi pregunta es cómo puedo almacenar la cookie en una variable global en cada solicitud para que pueda acceder desde cualquier lugar para el ajuste de la fecha.
Respuestas
0 para la respuesta № 1Puede usar una variable de sesión si no desea usar la cookie cada vez
session["MyVarName"] = mycookievalue
entonces puede acceder a la sesión cada vez que lo necesite.
También puede pensar en implementar e modelbinder personalizado para poder vincular el valor de su sesión a un modelo. (Por ejemplo, una clase UserSettingsModel)
1 para la respuesta № 2
Generalmente, cuanto más controladores y acciones dependen de los valores suministrados desde el exterior, más comprobables y robustas se vuelven. Lo haría de esta manera
Primero, cree un modelo que contenga configuraciones para la zona horaria
public class ClientTimeZoneSettings
{
public string TimeZoneName {get; set;} // or whatever
}
Luego, crea un modelo de carpeta. Ese modelo de carpeta se usará para extraer valores de la 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"]; }
}
}
}
Registre esa carpeta de modelo en Global.asax
Void protegido Application_Start () { AreaRegistration.RegisterAllAreas ();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.Add(typeof(ClientTimeZoneSettings), new ClientTimeZoneSettingsModelBinder());
}
Y el punto principal. En todas sus acciones que requieren esa configuración, puede usar directamente ClientTimeZoneSettings
como parámetro
public ActionResult ShowComments(ClientTimeZoneSettings settings)
{
// use settings
}
ACTUALIZAR: Enfoque significativamente más simple:
Instalar MvcFutures De Nuget. Contiene CookieValueProviderFactory
que inspeccionará automáticamente las cookies en busca de valores cuando se enlace el modelo. Para usarlo, simplemente agregue en ValueProviderFactories
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ValueProviderFactories.Factories.Add(new CookieValueProviderFactory());
}
Y luego nombra tu parámetro acorde al nombre de la cookie
public ActionResult ShowComments(string timeZoneName)
{
// timeZoneName will contain your cookie value
return View();
}