MVC3验证与英国的日期格式ComponentModel.DataAnnotations(也使用jQ

2019-06-23 14:44发布

我看到有这一些类似的问题,但没有解决我的问题。

我的工作与实体框架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());

Answer 1:

没错,问题是与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>


Answer 2:

我相信这是在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>


Answer 3:

你必须写你自己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

你澄清后这个答案应该帮助



Answer 4:

其实我已经找到了更好的解决方案在这里....由#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();
});


Answer 5:

我刚才已经有这个问题,我花了时间来追查原因。 我不是说这是你的问题,但有花了几个小时的开关上的一切,等globalisations后,我想我会发布的问题就在这里任何人的努力和我一样。

总之,在我的项目的问题其实不是我想的那样。 我饰以财产[DataAnnotationsExtentions.Date]其中,事实证明,渣土了镀铬的客户端验证(如果你想在英国12日起,每天IE),当涉及到本地化虽然它似乎做工精细在其他浏览器。 当我删除了它的工作



Answer 6:

问题是,通过如果你把一个叫你的文本框“日期”类的一些原因,铬只得到疯狂的在这里discribed 这个博客 。 我有同样的问题,我只是改变了类名customDate并得到解决。



文章来源: MVC3 Validation with ComponentModel.DataAnnotations for UK date format (also using jquery ui datepicker)