2012-06-30 57 views
54

如何強制asp.net mvc 4中的日期時間格式? 在顯示模式下,它顯示爲我想要的,但在編輯模式中不顯示。 我使用displayfor和editorfor和applyformatineditmode與dataformatstring =真= 「{0:DD/MM/YYYY}」 我曾嘗試:格式datetime在asp.net mvc 4

  • 全球化在web.config中(他們都)與我的文化和養蠶。
  • 修改的日期時間

中的Application_Start中的區域性和uiculture()

  • 定製ModelBinder的我不知道如何迫使它,我需要輸入的日期爲DD/MM/YYYY不是默認。

    更多信息: 我的視圖模型是這樣的

    [DisplayName("date of birth")] 
        [DataType(DataType.Date)] 
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
        public DateTime? Birth { get; set; } 
    

    鑑於我使用@Html.DisplayFor(m=>m.Birth)但按預期工作(我看到的格式) 和輸入的日期我使用@Html.EditorFor(m=>m.Birth)但如果我嘗試和輸入像13/12/2000類似的錯誤,它不是一個有效的日期(12/13/2000和2000/12/13按預期工作,但我需要dd/MM/yyyy)失敗。

    自定義模型綁定器在application_start()b/c中調用,我不知道其他地方。

    使用<globalization/>我試過culture="ro-RO", uiCulture="ro"和其他文化,會給我dd/MM/yyyy。 我也試圖將其放置在每個線程中的Application_Start()(這裏有很多的例子,對如何做到這一點)


    對於這一切會讀這個問題: 看來Darin Dimitrov的答案只要我沒有客戶端驗證就可以工作。 另一種方法是使用自定義驗證,包括客戶端驗證。 我很高興在重新創建整個應用程序之前發現了這一點。

  • +0

    請您提供:

    @Scripts.Render("~/Scripts/jquery-3.1.1.js") @Scripts.Render("~/Scripts/jquery.validate.min.js") @Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js") @Scripts.Render("~/Scripts/moment.js") 

    可以使用安裝moment.js更多信息?你的模型,控制器和視圖?還提供了您在顯示和編輯器模板之間獲得的不同輸出的示例。另請注意,文化是針對每個線程設置的。你提到了一些關於'Application_Start'的內容,但是這隻會在應用程序啓動時執行一次。隨後的要求呢?你如何爲他們設定文化? –

    +0

    application_start只能執行一次!改用application_beginRequest! – Nas

    +0

    Nas,application_beginRequest在哪裏?我只在Global看到application_start。在MVC 4事情開始有點不同,然後mvc 3 – amb

    回答

    96

    Ahhhh,現在很清楚。您似乎遇到綁定該值的問題。不是在視圖上顯示它。事實上,這是默認模型綁定器的缺點。您可以編寫並使用自定義的模型,該模型將考慮您的模型中的[DisplayFormat]屬性。我在這裏說明這樣的自定義模型粘合劑:https://stackoverflow.com/a/7836093/29407


    顯然有些問題依然存在。這裏是我的完整設置在ASP.NET MVC 3 & 4 RC上完美運行。

    型號:

    public class MyViewModel 
    { 
        [DisplayName("date of birth")] 
        [DataType(DataType.Date)] 
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
        public DateTime? Birth { get; set; } 
    } 
    

    控制器:

    public class HomeController : Controller 
    { 
        public ActionResult Index() 
        { 
         return View(new MyViewModel 
         { 
          Birth = DateTime.Now 
         }); 
        } 
    
        [HttpPost] 
        public ActionResult Index(MyViewModel model) 
        { 
         return View(model); 
        } 
    } 
    

    查看:

    @model MyViewModel 
    
    @using (Html.BeginForm()) 
    { 
        @Html.LabelFor(x => x.Birth) 
        @Html.EditorFor(x => x.Birth) 
        @Html.ValidationMessageFor(x => x.Birth) 
        <button type="submit">OK</button> 
    } 
    

    自定義模型綁定的註冊在Application_Start

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

    而且自定義模型粘合劑本身:

    public class MyDateTimeModelBinder : DefaultModelBinder 
    { 
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
        { 
         var displayFormat = bindingContext.ModelMetadata.DisplayFormatString; 
         var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    
         if (!string.IsNullOrEmpty(displayFormat) && value != null) 
         { 
          DateTime date; 
          displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty); 
          // use the format specified in the DisplayFormat attribute to parse the date 
          if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) 
          { 
           return date; 
          } 
          else 
          { 
           bindingContext.ModelState.AddModelError(
            bindingContext.ModelName, 
            string.Format("{0} is an invalid date format", value.AttemptedValue) 
           ); 
          } 
         } 
    
         return base.BindModel(controllerContext, bindingContext); 
        } 
    } 
    

    現在,無論你在你的web.config(<globalization>元素)或當前線程的文化有什麼文化設置,自定義模型粘合劑將使用DisplayFormat屬性的日期格式時解析可以爲空的日期。

    +1

    這是我用過的,但沒有運氣。我已經註冊了日期和日期時間?它甚至不顯示我的錯誤消息,所以我不認爲它正在使用。 – amb

    +1

    然後我會猜你必須顯示完整的代碼才能重現問題,因爲我使用這個模型綁定器時沒有任何問題。 –

    +0

    出於好奇,它是什麼類型的MVC項目(4或3)? – amb

    0

    感謝達林, 對我來說,能夠發佈到創建方法,它只有在我修改了BindModel代碼工作:

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
        var displayFormat = bindingContext.ModelMetadata.DisplayFormatString; 
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    
        if (!string.IsNullOrEmpty(displayFormat) && value != null) 
        { 
         DateTime date; 
         displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty); 
         // use the format specified in the DisplayFormat attribute to parse the date 
         if (DateTime.TryParse(value.AttemptedValue, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out date)) 
         { 
          return date; 
         } 
         else 
         { 
          bindingContext.ModelState.AddModelError(
           bindingContext.ModelName, 
           string.Format("{0} is an invalid date format", value.AttemptedValue) 
          ); 
         } 
        } 
    
        return base.BindModel(controllerContext, bindingContext); 
    } 
    

    希望這可以幫助別人...

    0

    客戶端驗證問題可以在jquery.validate.unobtrusive.min.js不以任何方式接受日期/日期時間格式的發生是因爲MVC的bug(即使在MVC 5)的。不幸的是,你必須手動解決它。

    我終於工作液:

    $(function() { 
        $.validator.methods.date = function (value, element) { 
         return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid(); 
        } 
    }); 
    

    你必須包括前:

    Install-Package Moment.js