2017-05-31 147 views
0

我正在生產環境中工作。問題是DOB字段提供了mvc模型驗證,並且在視圖中使用了jquery.validate.unobtrusive.js來驗證表單。MVC模型驗證失敗 - 日期必須是有效日期

日期選擇器用於選擇日期,當我提交表單時,ModelState.IsValid失敗。

代碼如下所示。這適用於Chrome,但不適用於其他瀏覽器。

在我的模型:

[Required(ErrorMessage = "Please enter DOB")] 
[DataType(DataType.Date)] 
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] 
public Nullable<System.DateTime> DOB { get; set; } 

這是我的看法:

<div class="col-md-6"> 
    <div class="col-xs-12"> 
     <label>DATE OF BIRTH<p>*</p></label> 
    </div> 
    <div class="col-xs-12"> 
     <div class="form-group"> 
      <div class="input-group" id="datetimepicker2"> 
       @Html.TextBoxFor(d => d.DOB, new { @class = "form-control input-validation-error" }) 
       <span class="input-group-addon"><span class="icon-small-calendar"></span></span> 
       </div> 
      @Html.ValidationMessageFor(m => m.DOB) 
      </div> 
    </div> 
</div> 

這是我的日期選擇器:

$('#datetimepicker2').datetimepicker({ 
     format: 'MM/DD/YYYY',   
     maxDate: new Date() 
    }); 

在我的控制器:

if (ModelState.IsValid) 
    { 
     ///some action 
    } 

在我的web.config:

<add key="ClientValidationEnabled" value="true" /> 
<add key="UnobtrusiveJavaScriptEnabled" value="true" /> 

有人能幫助我如何提前 解決這個問題對於所有瀏覽器

感謝塔拉克

+0

的https: //tutorials.com/questions/28114874/html-displayfor-dateformat-mm-dd-yyyy它可以幫助 –

回答

0

通常情況下,錯誤「日期必須是有效日期「是由JQuery驗證框架生成的客戶端(在瀏覽器中)。如果是這種情況,您需要重寫用於驗證的JavaScript方法。爲了做到這一點,在客戶端的JavaScript IIFE,您可以添加類似的東西:

if (!$.validator) { 
    return; 
} 

// Tell the validator that we want dates parsed using Globalize 
    $.validator.methods.date = function(value, element) { 
    // parse the value parameter into a Date datatype using your own logic or that of a framework like JQuery Globalize. In the example, I used JQuery Globalize 
    var parsedValue = Globalize.parseDate(value, $.validator.methods.dateGlobalizeOptions.dateParseFormat);. 
     return this.optional(element) || (parsedValue instanceof Date); 
    }; 

此外,您可能需要實現在服務器端自定義的DataBinder:

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

     object result = null; 
     if (value != null) 
     { 
      result = DateTime.ParseExact(value, "MM/DD/YYYY", CultureInfo.InvariantCulture, DateTimeStyles.None);     
     } 

     return result; 
    } 
} 
//and in global.asax.cs add 
ModelBinders.Binders.Add(typeof(Datetime), new Binders.DateTimeModelBinder()); 
+0

@Tarak我按照建議編輯了global.asax.cs。謝謝你,對於錯字感到抱歉! –