2011-09-09 36 views
0

我有一個ASP.NET MVC博客,爲了顯示客戶端時區中的帖子和評論日期,使用了cookie,該cookie包含客戶端時區偏移量。當服務器收到一個請求時,它會從cookie中讀取偏移值,並在發送給瀏覽器之前相應地更改所有日期。我的問題是如何將cookie存儲在每個請求的全局變量中,以便可以通過任何地方進行日期調整。在ASP.NET中存儲cookie值在全局變量mvc

回答

0

您可以使用一個會話變量,如果你不想使用cookie每次

session["MyVarName"] = mycookievalue 

,那麼你可以每天所需要的時間訪問會話。

您還可以考慮實施e自定義模型綁定器,以便您可以將會話的值綁定到模型。 (例如一個類UserSettingsModel)

1

通常,更多的控制器和動作取決於從外部提供的值,他們變得越多,可測試的單元越多。我會做這樣

首先,創建一個時區的

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中

保護無效的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:值得注意的是更簡單的方法:

從安裝的NuGet MvcFutures。它包含CookieValueProviderFactory,它會在模型​​綁定時自動檢查cookie的值。要使用它,只需添加到ValueProviderFactories

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 

    ValueProviderFactories.Factories.Add(new CookieValueProviderFactory()); 
} 

然後命名您的參數accorting到cookie的名稱