为什么ValidationMessageFor在此实例中不显示我的验证消息?

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并继续前进,但我正在努力的设计需要内联验证消息.

有谁知道为什么会这样?

Dan*_*kiy 9

对于谷歌搜索这个麻烦的人:

在使用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)