Сохранение значения cookie в глобальной переменной в asp.net mvc - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть блог ASP.NET MVC, для того чтобы показывать даты публикаций и комментариев в часовом поясе клиента, используется cookie, cookie содержит смещение часового пояса клиента. Когда сервер получает запрос, он считывает значение смещения из cookie и соответственно изменяет все даты перед отправкой в ​​браузер. Мой вопрос, как я могу сохранять cookie в глобальной переменной при каждом запросе, чтобы к нему мог обратиться любой, где для корректировки даты.

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Как правило, чем больше контроллер и действие зависят от значений, поступающих извне, тем более надежными и проверяемыми они становятся.Я бы сделал это следующим образом:

Сначала создайте модель, которая содержит настройки для часового пояса

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();
}
0 голосов
/ 09 сентября 2011

Вы можете использовать переменную сеанса, если вы не хотите использовать cookie каждый раз

session["MyVarName"] = mycookievalue

тогда вы можете обращаться к сеансу каждый раз, когда это необходимо.

Вы также можете подумать о внедрении пользовательского связывателя моделей, чтобы связать значение сеанса с моделью. (например, класс UserSettingsModel)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...