1

我有一个标准的 asp.net mvc 4 视图,其表单具有一些可编辑字段,包括 DataTime 选择。当表单回传到控制器时,DateTime 始终显示为 DateTime 1/1/0001 的最小值,即使有效日期已成功发送到客户端或在客户端上选择。

我猜 DefaultModelBinding 搞砸了,但我不确定为什么或如何。在我的 web.config 我有以下全球化:

<globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto"/>

这是接收帖子的控制器中的我的 ActionResult:

[HttpPost]
public virtual ActionResult Edit(KBUser kbuser)
{
    if (this.ModelState.IsValid)
    {
        //save the user
        m_userRepo.UpdateUser(kbuser);


        return RedirectToAction(MVC.Users.Index());

    }
    else
    {
        return View(kbuser);
    }

}

这是视图的相关部分:

@model KBMaxLive.Domain.KBUser

@using (Html.BeginForm("Edit", "User", new { idUser = Request["idUser"] }, FormMethod.Post, new { id = "form" }))
    { 
        <fieldset>
            <legend>@Engine.Resources.KBMaxLive.Account</legend>

             <div class="field-column-container">
                <div class="field-column">
                    <div class="field-container">
                        @Html.LabelFor(u => u.CreatedDate)
                        @Html.TextBoxFor(u => u.CreatedDate, new { @class = "k-textbox", @readonly = "readonly" }) 
                        @Html.ValidationMessageFor(u => u.CreatedDate)
                    </div>
                </div>
            </div>
        </fieldset>
    }

除日期时间外,模型的所有属性都很好。
关于出了什么问题或如何调试的任何想法?

4

1 回答 1

0

默认模型绑定器在解析 POST 请求的日期时间时使用当前区域性。从您的 web.config 片段中,您可以看出您正在使用auto. 这意味着当前的文化将由客户端浏览器首选项决定。例如,在 Google Chrome 中,您可以配置语言列表及其优先顺序。然后浏览器将Accept-Language随每个请求一起发送标头。

例如:

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

然后 ASP.NET MVC 将使用这种语言来设置请求的文化。这意味着模型绑定器将期望以为此语言定义的格式输入日期时间。因为en-US那将是MM/dd/yyyy. 如果您已将浏览器配置为使用不同的首选语言,则用户需要根据此偏好键入日期时间。

另一方面,如果您希望所有日期都采用特定格式,无论客户端浏览器配置如何,您都可以编写自定义模型绑定器。例如,我已经展示了如何this answer使用DisplayFormat相应视图模型属性上的属性来完成此操作。

于 2012-10-15T06:35:18.620 回答