Pau*_*art 2 validation partial-views asp.net-mvc-2
我有一个视图模型,包含5个类的实例作为子属性.这些子属性使用局部视图呈现,如下所示:
<%Html.RenderPartial("_EntryItemForm", Model.EntryItem1, new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "EntryItem1" } }); %>
<%Html.RenderPartial("_EntryItemForm", Model.EntryItem2, new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "EntryItem2" } }); %>
<%Html.RenderPartial("_EntryItemForm", Model.EntryItem3, new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "EntryItem3" } }); %>
<%Html.RenderPartial("_EntryItemForm", Model.EntryItem4, new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "EntryItem4" } }); %>
<%Html.RenderPartial("_EntryItemForm", Model.EntryItem5, new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "EntryItem5" } }); %>
Run Code Online (Sandbox Code Playgroud)
在局部视图中,我有以下内容(仅显示一个字段):
<%: Html.LabelFor<EntryItemForm, string>(x => x.ItemName)%>
<%: Html.TextBoxFor<EntryItemForm, string>(x => x.ItemName)%>
<%: Html.ValidationMessageFor(x => x.ItemName)%>
Run Code Online (Sandbox Code Playgroud)
标签和文本框都使用正确的ID,名称等进行渲染,默认模型绑定器可以完美地处理所有内容.
不幸的是,即使ModelState包含ItemName字段的错误,ValidationMessage也不会出现.如果我将ValidationSummary添加到父视图,则会显示错误.通常我只是使用ValidationSummary并继续前进,但我正在努力的设计需要内联验证消息.
有谁知道为什么会这样?
对于谷歌搜索这个麻烦的人:
在使用HtmlFieldPrefix时,ModelState未以正确方式传递到局部视图的原因导致的问题.这个html助手解决了这个问题(对我而言),验证错误显示正确:
public static void RenderPartialWithPrefix(this HtmlHelper helper, string partialViewName, object model, string prefix)
{
ViewDataDictionary WDD = new ViewDataDictionary {TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = prefix } };
foreach(string key in helper.ViewData.ModelState.Keys)
{
if(key.StartsWith(prefix+"."))
{
foreach (ModelError err in helper.ViewData.ModelState[key].Errors)
{
if(!string.IsNullOrEmpty(err.ErrorMessage))
WDD.ModelState.AddModelError(key, err.ErrorMessage);
if (err.Exception != null)
WDD.ModelState.AddModelError(key, err.Exception);
}
WDD.ModelState.SetModelValue(key, helper.ViewData.ModelState[key].Value);
}
}
helper.RenderPartial(partialViewName,model,WDD);
}
Run Code Online (Sandbox Code Playgroud)
只需将它用于带前缀的渲染部分视图
@{Html.RenderPartialWithPrefix("_StructureEditSharePartView", Model.sharePart,"sharePart");}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4614 次 |
| 最近记录: |