【发布时间】:2012-12-28 14:27:59
【问题描述】:
-
是否可以将 Html.ValidateFor 与不显眼的验证一起使用?我希望能够做到以下几点:
@Html.TextBoxFor(m => m.Title)
@{ Html.ValidateFor(m => m.Age); } 为什么在启用非侵入式验证时禁用 ValidateFor?什么是同时使用两者的简单方法?
【问题讨论】:
是否可以将 Html.ValidateFor 与不显眼的验证一起使用?我希望能够做到以下几点:
@Html.TextBoxFor(m => m.Title)
@{ Html.ValidateFor(m => m.Age); }
为什么在启用非侵入式验证时禁用 ValidateFor?什么是同时使用两者的简单方法?
【问题讨论】:
我添加了一个 HTML 扩展方法,它将检查模型元数据并生成所有 data-val* 属性(供 jquery.unobtrusive.validation 使用)。
这样我可以完全控制控件的呈现方式(有时 Html.*For 系列方法会产生不适合我需要的名称和 id 属性,添加额外的参数可能会变得笨拙)。
注意,您仍然需要在表单元素内拥有input 控件(jquery.unobtrusive.validation 需要)。
public static MvcHtmlString Validation<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression) {
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
IDictionary<string, object> dataValAttrs = html.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata);
StringBuilder stringBuilder = new StringBuilder();
foreach (var dataValAttr in dataValAttrs) {
stringBuilder.Append(' ').Append(dataValAttr.Key).Append("=\"").Append(dataValAttr.Value).Append('"');
}
return new MvcHtmlString(stringBuilder.ToString());
}
以下是如何使用此方法:
<textarea name="Description" class="input-block-level" @Html.Validation(m => m.FormData.Description)></textarea>
@Html.ValidationMessage("Description")
请注意,您不能在这里使用Html.ValidationMessageFor 版本,因为它会创建名称FormData_Description,这与我在这种情况下想要的Description 不同(用于将POST 操作绑定到FormData 对象。
【讨论】: