我实现了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中搜索属性。
答案 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)