2011-12-12 20 views
12

基本上,我的日期選擇器使用英國格式dd/mm/yyyy。但是當我提交表單時,ASP.net顯然使用美國格式。 (將只有不到12天接受,即認爲這是一個月。)ASP.NET MVC3:強制控制器使用日期格式dd/mm/yyyy

public ActionResult TimeTable(DateTime ViewDate) 

有沒有辦法迫使它承認某種方式?

奇怪的是,其他插入方法似乎認識到正確的格式。

「的參數字典包含Mysite.Controllers.RoomBookingsController用於非空類型System.DateTime的參數ViewDate一個空條目方法System.Web.Mvc.ActionResult Index(System.DateTime)。一個可選參數必須是引用類型,可空類型,或聲明爲可選參數」。

+0

注意:如果您希望使用MVC3保存,您還需要更改不顯眼的JavaScript。否則它不會讓你發佈。 http://stackoverflow.com/questions/12053022/mvc-datetime-validation-uk-date-format – Doomsknight

回答

16

請仔細閱讀this。它給出了一個很好的解釋,說明發生了什麼,以及它爲什麼會起作用。

我的情況是,我使用本網站知道每個人是在英國,所以我可以放心地覆蓋默認DateTime模型綁定:

public class DateTimeModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var date = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue; 

     if (String.IsNullOrEmpty(date)) 
      return null; 

     bindingContext.ModelState.SetModelValue(bindingContext.ModelName, bindingContext.ValueProvider.GetValue(bindingContext.ModelName)); 
     try 
     { 
      return DateTime.Parse(date); 
     } 
     catch (Exception) 
     { 
      bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid.", bindingContext.ModelName)); 
      return null; 
     } 
    } 
} 
+0

通過提供的閱讀,它更有意義的不同情況。這篇文章立即調用一個視圖的格式不同。作爲其他職位存儲到數據庫,因此被正確識別。 – Doomsknight

+0

好吧,那麼,我會將此代碼/我將如何引用它,可以使用。乾杯 – Doomsknight

+2

我上面的代碼在一個粘合劑目錄中它自己的文件。然後,您需要註冊粘合劑'的Application_Start()'喜歡的東西'ModelBinders.Binders.Add(typeof運算(日期時間),新DateTimeModelBinder())' –

3

您需要爲DateTime使用自定義ModelBinder。我和你有同樣的問題。

2

您是否嘗試將當前文化設置爲en-GB?

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 

    CultureInfo cultureInfo = CultureInfo.GetCultureInfo("en-GB"); 

    Thread.CurrentThread.CurrentCulture = cultureInfo; 
    Thread.CurrentThread.CurrentUICulture = cultureInfo;      
} 
+0

這會去哪裏?的Global.asax.cs? – Doomsknight

+1

有幾個地方,我的例子是重寫Controller初始化方法,但你可以把它放在View.InitializeCulture或Global.asax中。看這裏; http://forums.asp.net/p/1521130/3656712.aspx –

+0

這不會工作,除非'DateTime'來自表單集合。如果它來自查詢字符串或路由數據,則文化被忽略。 –

2

基本上,我的日期選擇器採用的DD/MM/YYYY

初學者的錯誤英國格式。它應該使用瀏覽器設置的任何格式。問題不是格式,而是客戶端和服務器之間的格式不同。服務器應該發出代碼,根據協商的區域設置格式化日期,然後服務器也用它來解析它。

但是當我提交表單時,ASP.NET顯然使用US格式。

沒有。這是說,當我吃香料時,它總是鹽,然後你總是拿鹽。您的服務器接受當前協商的文化 - 除非您修改設置 - 在客戶端和服務器之間進行協商。檢查線程當前的文化,當它應該做解析,看看它是爲什麼設置。

+0

確定添加此在的Application_BeginRequest(),所以如果使用的DateTimePicker瀏覽器的設置選項,它仍然進來asp.net代碼表示的日期時間,無論datetimepickers格式的實際? – Doomsknight

+0

取決於你如何編寫它也可以來作爲從寫的不好的日期時間選擇器字符串你說「我的日期時間選擇器」修復它;) – TomTom

+1

它的Jquery的DateTimePicker :) – Doomsknight

2

你可以這樣做:

    全球範圍內(全球範圍內)
  • 。一種方法

    ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder()); 
    
  • :下的Application_Start)ASAX()自定義模型類

    public ActionResult TimeTable([Binder(typeof(DateTimeModelBinder)]DateTime ViewDate) 
    
  • - 啊不,不posibility因爲你使用結構的DateTime ;-)

啊,對不起,我不能添加評論亞當斯後 - 它是基於他的代碼。

0

從我BindigTools爲bindning日期時間? (可空),基於一些書樣本 - Pro MVC3

public static DateTime? GetValueNDateTime(ModelBindingContext context, string searchPrefix, string key, string format) 
    { 
     ValueProviderResult vpr = context.ValueProvider.GetValue(searchPrefix + key); 
     DateTime outVal; 
     if (DateTime.TryParseExact(vpr.AttemptedValue, format, null, System.Globalization.DateTimeStyles.None, out outVal)) 
     { 
      return outVal; 
     } 
     else 
     { 
      return null; 
     } 
    } 

它使用解析確切,所以你不應該有任何解析日期的問題。