这是可行的,但是如何???
我有一个帖子的控制器操作:
[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);
我认为:
<%= Html.TextBox("BirthDate", String.Format("{0:g}", Model.BirthDate)) %>
<%= Html.ValidationMessage("BirthDate", "*") %>
蚂蚁来了:我希望模型包含新的空白日期时间,因为我没有放入任何新数据。其次,当视图显示某些内容时,它必须是日期时间,因为Model.BirthDate
除了 DateTime 之外不能容纳任何东西。
但令我惊讶的是,它显示了一个带有“blabla”值的文本框! (以及后面的红色*)
这当然很好,因为用户可以看到他输入的错误内容,但是如何将该(blabla)字符串传输到日期时间字段中的视图?
编辑:
ModelState 信息在这里帮了我很多。
我还注意到,在 MVC 2 中,当您创建自己的模板时
Html.EditorFor()
你必须自己实现这个行为。
我创建了一个
DateTime.ascx
在 /views/shared/EditorTemplates 文件夹中,我必须检查此属性值是否存在模型状态错误,如果是,则显示无效数据而不是模型数据。
所以在视图中我使用这个:
<%= 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 %>" />