我有一个标准的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>
}
除日期时间外,模型的所有属性都很好 关于出了什么问题或如何调试这个的想法?
答案 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
属性。