我看到有这一些类似的问题,但没有解决我的问题。
我的工作与实体框架4.3的应用程序MVC3。 我有计划让用户使用jQuery UI日期选择器(这是我的工作得到了感谢编辑UK日期字段这个博客 )。
幸运的是我这个博客包括了制作使用英国格式日期选择器的指令,然而,EF验证仍然告诉我,我需要输入一个有效的日期格式。 Wierdly它并不能阻止我提交日期为DB它只是不显眼的验证踢和显示消息。
目前,我有以下数据注释:
[DataType(DataType.Date)]
public System.DateTime Module_Date { get; set; }
但我也尝试添加:
[DisplayFormat(DataFormatString="{0:dd/MM/yyyy}")]
其中有完全没有效果。 我希望有一个有一个解决方案,因为我不喜欢关闭不引人注目的验证来阻止这种错误消息。
谢谢
编辑
以下@Iridio答案,我看着加入模型绑定,并且确实是从这样一个,我看这似乎是做正确的事的几个帖子,但我已经想出了没有效果。 这是我曾尝试:
public class DateTimeBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture);
return date;
}
}
与此在Application_Start()
的方法Global.asax.cs
文件:
ModelBinders.Binders.Add(typeof(DateTime), new DateTimeBinder());
ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeBinder());
没错,问题是与JQuery验证脚本坚持使用美国datefomat。 我会克制我自己从上关于世界上大多数的使用DD / MM / YYYY虽然实际上是一个正确的言论去。
无论如何,最终我发现,在注释中回答我的困境了类似的回答问题 ,笔者这好心写了一篇博客文章关于他是如何解决这个问题。
基本上我已经使用了jQuery的脚本全球化时代和刚刚成立的文化en-GB
。 我要指出,在他的博客,他没有提到在哪里安放在你指定的文化一点,所以我就猛在脚本标记中引用全球化脚本下的页面:
<script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/globalize.culture.en-GB.js")" type="text/javascript"></script>
<script type="text/javascript">
Globalize.culture("en-GB");
$.validator.methods.date = function (value, element) {
return this.optional(element) || Globalize.parseDate(value);
};
</script>
我相信这是在jQuery UI的日期选择器附带的MVC3框架(jQuery的UI-1.8.11.js)的脚本版本中的错误。
如果指定了在英国的日期格式(如确实是博客状态):
$(document).ready(function () {
$('.date').datepicker({dateFormat: "dd/mm/yy"});
});
然后jQuery的UI的1.8.11.js似乎与验证日期的问题,并一直要求一个有效的英国日期(但验证随机出现)。 如果您更改日期格式为“MM / DD / YY”,那么这个问题就会消失,但多数民众赞成在没有好英国的日期。
该问题已在该库的更高版本中得到解决,以便下载最新版本(我相信1.8.18在写作时)或引用CDN:
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js" type="text/javascript"></script>
你必须写你自己ModelBinder的为DateTime类型。
这是我写的一个类似的problme但小数型(也许你会需要它)粘合剂。 你应该掌握的想法,并使其适应你的需要
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState { Value = valueResult };
object actualValue = null;
try
{
actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
}
catch (FormatException e)
{
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
然后在Global.asax中您注册粘结剂,大功告成
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
//Here you tell how to hendle the specific type
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
}
UPDATE
你澄清后这个答案应该帮助
其实我已经找到了更好的解决方案在这里....由#fretje
覆盖jQuery的日期
我稍微虽然如此,它仍然可以采取日期格式,如2012年5月30日低于修正了他/她的代码。
$(function () {
$.validator.addMethod(
"date",
function (value, element) {
//Added to validate dates like 31 May 2012
if (value.split('/').length === 1)
return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
var bits = value.match(/([0-9]+)/gi), str;
if (!bits)
return this.optional(element) || false;
str = bits[1] + '/' + bits[0] + '/' + bits[2];
return this.optional(element) || !/Invalid|NaN/.test(new Date(str));
},
"Please enter a date in the format dd/mm/yyyy"
);
$global.init();
});
我刚才已经有这个问题,我花了时间来追查原因。 我不是说这是你的问题,但有花了几个小时的开关上的一切,等globalisations后,我想我会发布的问题就在这里任何人的努力和我一样。
总之,在我的项目的问题其实不是我想的那样。 我饰以财产[DataAnnotationsExtentions.Date]
其中,事实证明,渣土了镀铬的客户端验证(如果你想在英国12日起,每天IE),当涉及到本地化虽然它似乎做工精细在其他浏览器。 当我删除了它的工作
问题是,通过如果你把一个叫你的文本框“日期”类的一些原因,铬只得到疯狂的在这里discribed 这个博客 。 我有同样的问题,我只是改变了类名customDate并得到解决。
文章来源: MVC3 Validation with ComponentModel.DataAnnotations for UK date format (also using jquery ui datepicker)