我有一个 MVC3 页面,其中包含一个对象(标题),其中包含我想在单个页面上更新的数据和对象列表(详细信息)。在详细信息对象上,我有也需要运行的自定义验证 (IValidatableObject)。
这似乎通常按预期工作,验证正在运行并返回 ValidationResults 并且如果我输入 @Html.ValidationSummary(false); 在页面上显示这些验证。但是,我不希望在顶部列出验证列表,而是在正在验证的项目旁边,即页面上的 Html.ValidationMessageFor,但不显示相关消息。有什么我想念的吗?这适用于其他页面(没有这种 Master-Details 情况),所以我认为这与我将如何设置要更新的项目列表或项目的编辑器模板有关?
Edit.cshtml(Header-Details 编辑视图)
@foreach (var d in Model.Details.OrderBy(d => d.DetailId))
{
@Html.EditorFor(item => d, "Detail")
}
Detail.ascx(详细信息编辑器模板)
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Detail>" %>
<tr>
<td>
<%= Model.Name %>
<%= Html.HiddenFor(model => model.DetailId) %>
</td>
<td class="colDescription">
<%= Html.EditorFor(model => model.Description) %>
<%= Html.ValidationMessageFor(model => model.Description) %>
</td>
<td class="colAmount">
<%= Html.EditorFor(model => model.Amount) %>
<%= Html.ValidationMessageFor(model => model.Amount) %>
</td>
</tr>
模型是实体框架,标题具有名称和 HeaderId,详细信息具有 DetailId、HeaderId、描述和金额
控制器代码:
public ActionResult Edit(Header header, FormCollection formCollection)
{
if (formCollection["saveButton"] != null)
{
header = this.ProcessFormCollectionHeader(header, formCollection);
if (ModelState.IsValid)
{
return new RedirectResult("~/saveNotification");
}
else
{
return View("Edit", header);
}
}
else
{
return View("Edit", header);
}
}
[我知道控制器代码可以稍微清理一下,只是在这种状态下,因为试图确定这里发生了什么]
IValidatableObject 实现:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.Name.Length < 5) && (this.Amount > 10))
{
yield return new ValidationResult("Item must have sensible name to have Amount larger than 10.", new[] { "Amount" });
}
}