ViewModel中的DateTime在Controller中显示为DateTime.MinValue

时间:2012-10-14 13:35:06

标签: asp.net-mvc asp.net-mvc-4

我有一个标准的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>
    }

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

1 个答案:

答案 0 :(得分: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处完成此操作,该{{3}}使用相应视图模型属性上的DisplayFormat属性。