【问题标题】:MVC DateTime validation failingMVC 日期时间验证失败
【发布时间】:2012-08-19 18:38:39
【问题描述】:

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

我认为奇怪的是,在 IE9 中它可以工作,但在 Firefox 和 Chrome 中却失败了。 每次我在 Firefox 或 Chrome 中尝试时,我都会收到消息“生日字段必须是日期”。

当我在一个新的 MVC 4 RTM 项目中尝试下面的代码时,我无法让它工作。我在所有浏览器中都看到 DateTime.Now 默认为 dd-MM-yyyy(荷兰),但我无法在 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")
}

【问题讨论】:

  • 对不起,我不知道如何格式化上面的MVC视图。

标签: asp.net-mvc asp.net-mvc-3 validation asp.net-mvc-4 model-validation


【解决方案1】:

我可以通过修改日期的 jQuery 验证器函数来解决这个问题:

 <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;
        },
        ''
    );

});

【讨论】:

  • 查看我对自己主题的回复。我写了一篇关于它的博文stackoverflow.com/a/12346915/801005
  • 我在尝试解决此问题时尝试了您的博客文章。当您想要为不同国家的许多用户提供最终解决方案时,我确信它是最佳解决方案。但是当您需要两分钟的解决方案并且您不关心多国用户群的本地化时,上面的脚本是合适的。
【解决方案2】:

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

http://www.locktar.nl/programming/mvc/localization-validation-in-mvc/

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

【讨论】:

  • 我用过ajax.aspnetcdn.com/ajax/jquery.validate/1.7/localization/…,我发现跟随你的链接。这在 IE 和 Firefox 中运行良好,但在 Chrome 中却不行。 Chrome 支持 html5 日期输入,并以“yyyy-mm-dd”格式存储值。我已将测试更改为: if (Modernizr.inputtypes.date) { return true; } else { }
  • 您是否已将 1.7 更改为最新版本?前段时间我写了那个博客。我刚刚在 www.locktar.nl 推出了我的新博客网站。
【解决方案3】:

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

不,这是不正确的。您可以在荷兰完全没问题,并且已将您的浏览器配置为使用中国文化。您无法使其正常工作的原因可能是因为在 FF 和 Chrome 中您没有正确的文化。

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

Accept-Language:en-US,en;q=0.8

这是在 Chrome 中的配置方式:

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

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

【讨论】:

  • 我的文化在 Firefox 和 chrome 中很好,所以这不是问题。问题是 jQuery 验证在 Firefox 和 Chrome 中的工作方式与在 Internet Explorer 中不同。请参阅这篇文章的答案和我的博客的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 2013-06-03
相关资源
最近更新 更多