这是可行的,但是如何???
我有一个帖子的 Controller 操作:
[AcceptVerbs(HttpVerbs.Post )]
public ActionResult Edit(Person person)
{
bool isvalid = ModelState.IsValid;
etc.
Person 对象有一个属性 BirthDate,类型为 DateTime。 当我在表单中输入一些无效数据时,比如“blabla”,这显然不是有效的日期时间,它会用正确的数据填充所有(其他)Person 属性,并用新的空白 DateTime 填充 BirthDate 属性。 bool isvalid 的值为“false”。 到目前为止一切顺利。
然后我这样做:
return View(p);
在 View 中我有这个:
<%= Html.TextBox("BirthDate", String.Format("{0:g}", Model.BirthDate)) %>
<%= Html.ValidationMessage("BirthDate", "*") %>
它来了:我希望模型包含新的空白日期时间,因为我没有放入任何新数据。其次,当 View 显示某些内容时,它必须是日期时间,因为 Model.BirthDate
除了 DateTime 之外不能容纳任何东西。
但令我惊讶的是,它显示了一个带有“blabla”值的文本框! (及其后面的红色*)
这当然很好,因为用户可以看到他输入的错误内容,但是如何将该(blabla)字符串传输到日期时间字段中的 View ?
编辑: ModelState 信息在这里帮了我很多。 我还注意到,在 MVC 2 中,当您创建自己的模板时 Html.EditorFor() 你必须自己实现这个行为。 我创建了一个
DateTime.ascx
在/views/shared/EditorTemplates 文件夹中,我必须检查该属性值是否存在模型状态错误,如果有,则显示无效数据而不是模型数据。
所以在 View 中我使用这个:
<%= 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 %>" />
最佳答案
ModelState 为每个表单元素保存 KeyValuePairs,其中键是字段名称,值是您在字段中输入的内容。然后,Html Helpers 在 ModelState 中查找,如果您没有显式指定值,它们将从 ModelState 中提取该值。
关于asp.net-mvc - asp.net MVC 如何记住回发时的错误值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2581042/