Asp.net mvc MVC日期时间验证失败

Asp.net mvc MVC日期时间验证失败,asp.net-mvc,asp.net-mvc-3,validation,asp.net-mvc-4,model-validation,Asp.net Mvc,Asp.net Mvc 3,Validation,Asp.net Mvc 4,Model Validation,我发现了很多simulair的问题,但不是一个好的干净的解决方案。我看到很多自定义代码可以让它工作,但为什么呢?这是否应该从一开始就不起作用 我觉得奇怪的是,在IE9中它可以工作,但在Firefox和Chrome中却失败了。 每次我尝试Firefox或Chrome时,我都会收到一条信息“field Birth必须是一个日期” 当我在一个新的MVC4RTM项目中尝试下面的代码时,我无法让它工作。我看到了日期时间。现在在所有浏览器中默认为dd-MM-yyyy(Holland),但我不能在Firefo

我发现了很多simulair的问题,但不是一个好的干净的解决方案。我看到很多自定义代码可以让它工作,但为什么呢?这是否应该从一开始就不起作用

我觉得奇怪的是,在IE9中它可以工作,但在Firefox和Chrome中却失败了。 每次我尝试Firefox或Chrome时,我都会收到一条信息“field Birth必须是一个日期”

当我在一个新的MVC4RTM项目中尝试下面的代码时,我无法让它工作。我看到了日期时间。现在在所有浏览器中默认为dd-MM-yyyy(Holland),但我不能在Firefox和Chrome中提交它

全球化标记未在web.config中设置,因此它必须使用默认值。我来自荷兰,所以我想它应该有客户文化

public class RegisterModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
    //[DataType(DataType.Date)]
    public DateTime Birthday { get; set; }
}

[AllowAnonymous]
    public ActionResult Register()
    {
        RegisterModel vm = new RegisterModel()
        {
            Birthday = DateTime.Now
        };
        return View(vm);
    }

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            try
            {
                //WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
                //WebSecurity.Login(model.UserName, model.Password);
                return RedirectToAction("Index", "Home");
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
加价

<!-- language: lang-none -->
@model DateTimeWithDatePicker.Models.RegisterModel
@{
   ViewBag.Title = "Register";
}

<hgroup class="title">
    <h1>@ViewBag.Title.</h1>
    <h2>Create a new account.</h2>
</hgroup>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <fieldset>
        <legend>Registration Form</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.UserName)
                @Html.TextBoxFor(m => m.UserName)
            </li>
            <li>
                @Html.LabelFor(m => m.Birthday)
                @Html.EditorFor(m => m.Birthday)
            </li>
        </ol>
        <input type="submit" value="Register" />
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

@模型DateTimeWithDatePicker.Models.RegisterModel
@{
ViewBag.Title=“寄存器”;
}
@ViewBag.Title。
创建一个新帐户。
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@Html.ValidationSummary()
登记表
  • @LabelFor(m=>m.UserName) @Html.TextBoxFor(m=>m.UserName)
  • @LabelFor(m=>m.birth) @EditorFor(m=>m.birth)
  • } @节脚本{ @Scripts.Render(“~/bundles/jqueryval”) }
    全球化标记未在web.config中设置,因此它必须使用 违约我来自荷兰,所以我想它应该有客户文化

    public class RegisterModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }
    
        [Required]
        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        //[DataType(DataType.Date)]
        public DateTime Birthday { get; set; }
    }
    
    [AllowAnonymous]
        public ActionResult Register()
        {
            RegisterModel vm = new RegisterModel()
            {
                Birthday = DateTime.Now
            };
            return View(vm);
        }
    
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                try
                {
                    //WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
                    //WebSecurity.Login(model.UserName, model.Password);
                    return RedirectToAction("Index", "Home");
                }
                catch (MembershipCreateUserException e)
                {
                    ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                }
            }
    
            // If we got this far, something failed, redisplay form
            return View(model);
        }
    
    不,那不对。如果你是荷兰人,你可以把浏览器配置成使用中国文化。你不能让它工作的原因可能是因为在FF和Chrome中你没有正确的文化

    由于您尚未在web.config中的全球化元素中指定区域性,ASP.NET MVC将在请求头中使用从浏览器发送的区域性。例如,如果将浏览器配置为en-US区域性,则每个请求将设置以下标题:

    Accept-Language:en-US,en;q=0.8
    
    以下是在Chrome中的配置方式:

    因此,请确保您已将所需的语言放在列表的第一位


    如果您想在模型绑定期间使用与
    DisplayFormat
    属性中定义的语法相同的可靠方法,您可以编写一个自定义模型绑定器,如下所示:

    问题在于jQuery验证和本地化。似乎jQuery插件的消息和方法都有本地化文件。请参阅我的博客,详细解释这个问题以及我是如何解决的

    编辑:
    我刚刚发布了一篇新的博客文章,更新了所有本地化问题以及如何修复DateTime属性。请参阅我的新帖子。

    我通过修改jQuery validator函数的日期来解决这个问题:

     <script type="text/javascript">
    
      $(function () {
    
        var dateFormat="dd/mm/yy"; // en-gb date format, substitute your own
    
        $("#Birthday").datepicker({
            "dateFormat": dateFormat
        });
    
        jQuery.validator.addMethod(
            'date',
            function (value, element, params) {
                if (this.optional(element)) {
                    return true;
                };
                var result = false;
                try {
                    $.datepicker.parseDate(dateFormat, value);
                    result = true;
                } catch (err) {
                    result = false;
                }
                return result;
            },
            ''
        );
    
    });
    
    
    $(函数(){
    var dateFormat=“dd/mm/yy”;//en gb日期格式,替换您自己的日期格式
    $(“#生日”)。日期选择器({
    “dateFormat”:dateFormat
    });
    jQuery.validator.addMethod(
    “日期”,
    函数(值、元素、参数){
    if(此.可选(元素)){
    返回true;
    };
    var结果=假;
    试一试{
    $.datepicker.parseDate(日期格式,值);
    结果=真;
    }捕捉(错误){
    结果=假;
    }
    返回结果;
    },
    ''
    );
    });
    

    抱歉,我不知道如何格式化上面的MVC视图。我的文化在firefox和chrome中很好,所以这不是问题所在。问题是jQuery验证在Firefox和Chrome中的工作方式与在InternetExplorer中的不同。请看这篇文章的答案,我的博客将详细介绍。请看我对自己话题的回应。我写了一篇关于它的博客,当我试图解决这个问题时,我尝试了你的博客。我相信,当您希望为不同国家的许多用户提供最终解决方案时,这是最好的解决方案。但是当你需要两分钟的解决方案并且你不关心多国用户群的本地化时,上面的脚本是合适的。这在IE和Firefox中运行良好,但在Chrome中不起作用。Chrome支持html5日期输入,并以“yyyy-mm-dd”格式存储值。我已将测试更改为:if(modernizer.inputtypes.date){return true;}否则{}您是否已将1.7更改为最新版本?不久前我写了那个博客。我刚刚在www.locktar.nl上发布了我的新博客网站。