我只是实现了FluentValidation
,除了一个笨拙的小细节外,其他一切看起来都很棒。
@using (Html.BeginForm("Create", "Posts", FormMethod.Post, new { @class = "create-post" }))
{
@Html.TextBoxFor(m => m.Text, new { @class = "post-input" })
@Html.Validation(m => m.Text)
<input type="submit" value="@Html.Resource("Publish")" />
}
public static MvcHtmlString Validation<T>(this HtmlHelper<T> helper, Expression<Func<T, string>> expression)
{
return helper.ValidationMessageFor(expression, null, Resources.Constants.ModelValidationMessageCssClass);
}
使用ASP.NET MVC 3的默认实现,此操作创建了一个
<span>
,该input-validation
具有验证者认为合适的任何类以及FluentValidation
(这是我的资源中的那个)。 FluentValidation
似乎只是忽略此设置。知道如何将CSS类选择器添加到novalidate="true"
生成的范围吗?类似地,以产生的输出为例:
<form method="post" class="create-post" action="/posts/create" novalidate="novalidate">
<input type="text" value="" name="Text" id="Text" data-val-required="complete this!" data-val-regex-pattern="long-stuff" data-val-regex="wrong regex!" data-val="true" class="post-input input-validation-error">
<span data-valmsg-replace="true" data-valmsg-for="Text" class="field-validation-error">
<span for="Text" generated="true" class="">wrong regex!</span>
</span>
<input type="submit" value="Publicar!">
</form>
我感觉我回到了ASP.NET WebForms中:( ..,如何删除
generated="true"
或data
属性之类的东西?我对属性很好。 最佳答案
因此,我认为引起麻烦的第一件事是您的Validation扩展方法。它调用ValidationMessageFor,它是HTML帮助器上的MVC3扩展,但是具有与传递验证消息相匹配的签名:
public static MvcHtmlString ValidationMessageFor<TModel, TProperty>
(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string validationMessage)
根据您的代码,实际上我会根据来自
<span>
生成方式的以下代码片段,将错误消息作为资源中的CSS类名称:if (!String.IsNullOrEmpty(validationMessage)) {
builder.SetInnerText(validationMessage);
}
else if (modelError != null) {
builder.SetInnerText(GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, modelState));
}
因此,您可能希望将扩展名修改为以下内容(如果不被否决):
public static MvcHtmlString Validation<T>(this HtmlHelper<T> helper, Expression<Func<T, string>> expression)
{
return helper.ValidationMessageFor(expression, null, null, new { _class = Resources.Constants.ModelValidationMessageCssClass });
}
但最重要的是,我认为FluentValidation与生成的标记没有关系-它只应将您的验证错误提供给ModelState,其余由ASP.NET MVC完成。如果您想获得更多控制权,则可以编写自己的HTML标签构建器;我从MVC3 source那里获取了大部分信息,因此您可以遵循它们的模式或采用其他方式。您也可以参考FluentValidation source以获得更多信息。
关于c# - FluentValidation不尊重我的CSS类添加,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9547701/