asp.net MVC如何在回发时记住我的错误值?

Mic*_*hel 6 asp.net-mvc asp.net-mvc-2

这是工作,但如何???

我有一个控制器动作的帖子:

[AcceptVerbs(HttpVerbs.Post )]
public ActionResult Edit(Person person)
{
   bool isvalid = ModelState.IsValid;
   etc.
Run Code Online (Sandbox Code Playgroud)

Person对象具有属性BirthDate,类型为DateTime.当我在表单中输入一些无效数据时,说'blabla'显然不是有效的Datetime,它用正确的数据填充所有(其他)Person属性,并用新的空白DateTime填充BirthDate属性.bool isvalid的值为'false'.到现在为止还挺好.

然后我这样做:

return View(p);
Run Code Online (Sandbox Code Playgroud)

在视图中我有这个:

<%= Html.TextBox("BirthDate", String.Format("{0:g}", Model.BirthDate)) %>
<%= Html.ValidationMessage("BirthDate", "*") %>
Run Code Online (Sandbox Code Playgroud)

它出现了Ant:我期望模型包含新的,空白的DateTime,因为我没有放入任何新数据.其次,当View显示某些内容时,它必须是DateTime,因为Model.BirthDate除了DateTime之外不能保留任何东西.但令我惊讶的是,它显示了一个带有'blabla'值的文本框!(和它背后的红色*)

哪个是好的,因为用户可以看到他输入错误的内容,但是如何将该(blabla)字符串转移到DateTime字段中的View?

编辑:ModelState信息在这里帮了我很多忙.我还注意到在MVC 2中,当您为Html.EditorFor()创建自己的模板时,您必须自己实现此行为.我创造了一个

DateTime.ascx 
Run Code Online (Sandbox Code Playgroud)

在/ views/shared/EditorTemplates文件夹中,我必须检查此属性值是否存在模型状态错误,如果是,则显示无效数据而不是模型数据.

所以在视图中我用这个:

 <%= Html.LabelFor(model => model.DateOfBirth) %>
Run Code Online (Sandbox Code Playgroud)

在DateTime.ascx我用这个:

<%
bool invalidData = false;
string propertyName = ViewData.ModelMetadata.PropertyName;

ModelState ms = ViewData.ModelState[propertyName];
if (ms != null)
{
   invalidData = ms.Errors.Count > 0;
}
string valueToshow = invalidData ? ViewData.ModelState[propertyName].Value.AttemptedValue : String.Format("{0:g}", Model);
%>
<input class="text-box single-line" id="<%= propertyName %>" name="<%= propertyName %>" type="text" value="<%= valueToshow %>" />
Run Code Online (Sandbox Code Playgroud)

Kei*_*eau 10

ModelState为每个表单元素保存KeyValuePairs,其中键是字段名称,值是您在字段中放置的值.然后Html Helpers在ModelState中查找,如果没有显式指定值,它们将从ModelState中提取值.