MVC模型验证失败 - 日期必须是有效日期

时间:2017-05-31 07:34:11

标签: asp.net-mvc date jquery-validate unobtrusive-validation

我正在开发一个生产环境。问题是DOB字段提供了mvc模型验证,在视图中jquery.validate.unobtrusive.js用于验证表单。

日期选择器用于选择日期,当我提交表单时,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" />

有人可以帮我解决所有浏览器的问题吗

提前致谢 塔拉克

1 个答案:

答案 0 :(得分:0)

通常,JQuery验证框架会在客户端(在浏览器中)生成错误“Date必须是有效日期”。如果是这种情况,则需要覆盖用于验证的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());