0
  1. 是否可以将 Html.ValidateFor 与不显眼的验证一起使用?我希望能够做到以下几点:

    < !-- 我想使用 data-val* 属性指定验证 -->
    < input type="text" data-val-required/>

    < !-- 我想使用 HTML 助手通过视图模型属性注入 data-val* 属性 -->
    @Html.TextBoxFor(m => m.Title)

    < !-- 我也希望自己能够渲染输入控件,但也包括来自视图模型属性的验证,并且也吃掉它 -->
    @{ Html.ValidateFor(m => m.Age); }

  2. 为什么在启用不显眼的验证时禁用 ValidateFor?什么是同时使用两者的简单方法?

4

1 回答 1

1

我添加了一个 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 对象。

于 2013-01-14T21:03:10.673 回答