MVC 模型验证失败 - 日期必须是有效日期
MVC model validation fails - Date must be a valid date
我正在生产环境中工作。问题是 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" />
谁能帮我解决所有浏览器的问题
提前致谢
塔拉克
通常,错误 "Date must be a valid date" 是由 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());
我正在生产环境中工作。问题是 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" />
谁能帮我解决所有浏览器的问题
提前致谢 塔拉克
通常,错误 "Date must be a valid date" 是由 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());