模板中的MVC2 ValidationMessage无法呈现

时间:2010-07-20 13:21:09

标签: asp.net-mvc templates

我实现了Brad Wilson在this posting中描述的template.master技术,但是我更改了他的EditorTemplates / Template.master的第31行:

<%= Html.ValidationMessage("", "*") %>

为:

<%= Html.ValidationMessage(ViewData.ModelMetadata.PropertyName)%>

这样实际的验证文本将显示在控件旁边。 这不会呈现任何内容 。如果我将同一行移动到object.ascx文件中,它会呈现,但不会在布局中的正确位置。元数据生命周期中的某些内容是否在此时未填充?

更新

我在object.ascx中有这个,它可以工作。

   <%= Html.Editor(prop.PropertyName)%>
   <p>
       <%=Html.ValidationMessage(prop.PropertyName)%>
   </p>

UPDATE2

这适用于模板:

 <%= Html.ValidationMessage("")%>

我认为模板的范围是在控制级别,而不是视图模型级别,因此“”只使用整个控件模型,而不是从viewmodel中搜索属性。

2 个答案:

答案 0 :(得分:0)

您的模型状态中必须缺少某些内容,或者您​​已将密钥更改为属性名称。

ValidationMessage(任何东西)的内容很简单:

 private static MvcHtmlString ValidationMessageHelper(this HtmlHelper htmlHelper, ModelMetadata modelMetadata, string expression, string validationMessage, IDictionary<string, object> htmlAttributes) {
        string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression);
        FormContext formContext = htmlHelper.ViewContext.GetFormContextForClientValidation();

        if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName) && formContext == null) {
            return null;
        }

        ModelState modelState = htmlHelper.ViewData.ModelState[modelName];
        ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors;
        ModelError modelError = ((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors[0];

        if (modelError == null && formContext == null) {
            return null;
        }

唯一的另一个问题是,如果你以某种方式清除了validationMessage。

答案 1 :(得分:0)