【发布时间】:2012-10-09 00:38:25
【问题描述】:
我有一个 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>
Model 是实体框架,Header 包含 Name 和 HeaderId,Detail 包含 DetailId、HeaderId、Description 和 Amount
控制器代码:
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" });
}
}
【问题讨论】:
-
你说它适用于 ValidationSummary?但不是与个人消息?如果你查看源代码,你能看到消息吗?
-
我可以在验证摘要中看到消息
- 项目的金额无效。 ...但不适用于单个项目
如果禁用客户端验证会发生什么?这只是一个测试,看看问题是否出在客户端。在 Web.Config 中将 ClientValidationEnabled 设置为 false。相同的结果:总结,而不是单个项目您能否编辑您的问题以包含模型定义并显示您的控制器代码?
标签: asp.net-mvc-3 validation mvc-editor-templates