2012-03-22 18 views
8

我有日期的噩夢。基於英國,所以我們的日期格式是dd/MM/yyyy。這是用戶在需要某個日期時將輸入到表單中的內容。我有一個表單只接受這樣一個屬性。這顯然是一個DateTime類型。我想發送這個表單到控制器的GET,所以用戶有一個很好的URL他們可以保存傳遞等等。視圖也需要綁定一個JQuery UI日期選擇器到這個元素。我還需要表單元素有一定的id和class,所以我真的需要這樣來呈現給表單:在HTTP GET中綁定en-GB日期

@Html.TextBoxFor(model => model.ReturnDate, new { Class = "date", id = "ReturnDate" }) 

我指定在web.config英國文化變異:

<globalization uiCulture="en" culture="en-GB"/> 

雖然如此處所述(http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx)所示,當獲得控制器執行時,MVC忽略了文化變體並默認爲US(顯然,沒有人存在於美國以外,所以這對微軟來說是好的,沒有幫助,因爲這意味着我必須在每個模型中的每個日期設置爲

這意味着,如果用戶鍵入01/05/2012我最終與05/01/2012這是錯誤的!

我看過這個問題的各種解決方案,但沒有真正適合我需要的。我需要一種方式,以便所有通過GET發送的日期都是英國格式。我們完全基於英國,因此沒有任何英國格式將被輸入。

我真的不想創建和編輯器,除非他們是一種我沒有View/Viewmodel附加到這個編輯器的方式,因爲它將會強有力地使用到處都有日期選擇器。

所有的幫助將感激地收到!

+0

您鏈接的帖子怎麼不能解決您的問題? – Jon 2012-03-22 11:38:11

+0

據我所見,我需要爲每個查詢字符串參數執行此操作? (bindingContext.HttpContext.Request.QueryString [「theDate」];)這是不實際的。 – Liam 2012-03-22 11:40:49

+1

如果你實現了自定義模型聯編程序,它會影響整個應用程序,querystrings,表單數據,cookie等日期進入你的應用程序的方式 – Jon 2012-03-22 11:43:12

回答

10

得到了解決,感謝@喬恩爲指針:

public class GBDateModelBinder : IModelBinder 
{ 

    #region IModelBinder Members 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     string dateString = controllerContext.HttpContext.Request.QueryString[bindingContext.ModelName]; 
     if (string.IsNullOrEmpty(dateString)) 
       dateString = controllerContext.HttpContext.Request.Form[bindingContext.ModelName]; 
     DateTime dt = new DateTime(); 
     bool success = DateTime.TryParse(dateString, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dt); 
     if (success) 
     { 
      return dt; 
     } 
     else 
      { 
      return null; 
     } 
    } 

    #endregion 
} 

然後在Global.asax中註冊:

ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder()); 

UPDATE

改變這允許發佈時也存在同樣的問題!

+0

我在哪裏把這個GBDateModelBinder:IModelBinder類? – KayGee 2016-08-19 07:33:00

+0

它不重要嗎?這是一堂課。只要您可以在globals.asax中進行訪問,將其註冊到您要放置的位置。 – Liam 2016-08-19 07:52:09

2

除了利亞姆的回答是:(!)

對於那些誰仍然有這個問題,並正在試圖綁定到一個可空日期時間,請確保您註冊在Global.asax的正確類型:

ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder()); 
ModelBinders.Binders.Add(typeof(DateTime?), new GBDateModelBinder()); 

難道我難倒了15分鐘!