这是工作,但如何?asp.net MVC如何在回发中记住我的错误值?
我有一个职位控制器动作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Person person)
{
bool isvalid = ModelState.IsValid;
etc.
Person对象有一个属性生日,DateTime类型。 当我在表单中输入一些无效数据时,比如说'blabla'这显然不是一个有效的日期时间,它将使用正确的数据填充所有(其他)Person属性,并使用新的空白DateTime填充BirthDate属性。 bool无效的值为'false'。 目前为止这么好。
那么我这样做:
return View(p);
,并在视图中我有这样的:
<%= Html.TextBox("BirthDate", String.Format("{0:g}", Model.BirthDate)) %>
<%= Html.ValidationMessage("BirthDate", "*") %>
蚂蚁有说到:我的预期模型包含新的,空白的日期时间,因为我没有不会放入任何新数据。其次,当视图显示某些内容时,它必须是DateTime,因为Model.BirthDate
不能包含除DateTime之外的任何内容。 但令我惊讶的是,它显示了'blabla'值的文本框! (以及它后面的红色*)
哪个课程很好,因为用户可以看到他输入的内容是错误的,但是如何将该(blabla)字符串传送到日期时间字段中的视图?编辑: ModelState信息在这里帮了我很多。 我还注意到,在MVC 2中,当您为 Html.EditorFor() 创建自己的模板时,您必须自己实现此行为。 我创建了一个
DateTime.ascx
在/视图/共享/ EditorTemplates文件夹
,并在那里我不得不检查,如果有此属性值的ModelState错误,如果是这样,展现在代替无效数据模型数据。
所以在视图中我用这个:
<%= Html.LabelFor(model => model.DateOfBirth) %>
,并在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 %>" />
谢谢,现在没有帮手做了更多的解析模型中的值。 – Michel 2010-04-05 21:20:35