6

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

我认为奇怪的是,它在 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")
}
4

3 回答 3

7

我可以通过修改日期的 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;
        },
        ''
    );

});

于 2012-12-20T17:38:29.940 回答
3

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

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

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

于 2012-09-10T07:17:45.670 回答
1

全球化标签未在 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

于 2012-08-24T08:02:19.083 回答