c# - FluentValidation 不支持我添加的 CSS 类

标签 c# javascript css asp.net-mvc-3 fluentvalidation

我刚刚实现了 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>具有验证器认为合适的任何类 AND input-validation (这是我资源中的那个)。 FluentValidation似乎只是忽略此设置。知道如何将 CSS 类选择器添加到 FluentValidation 生成的跨度中吗? ?

类似地,以它产生的输出为例:

<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 中:( ..,我怎样才能删除像 novalidate="true"generated="true" 属性这样的东西?不过,我对 data 属性没问题。

最佳答案

所以我认为引起麻烦的第一件事是您的验证扩展方法。它调用 ValidationMessageFor,它是 HTML 帮助器上的 MVC3 扩展,但具有匹配传递给它的验证消息的签名:

public static MvcHtmlString ValidationMessageFor<TModel, TProperty>
    (this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string validationMessage)

根据您的代码,我实际上希望错误消息是您资源中的 CSS 类名称,基于 <span> 中的这个片段生成:

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/

相关文章:

c# - 术语 "pending dispatch"是什么意思?

c# - 类似于Json字符串的字典列表

c# - 如何读取可移植类库中的资源文件?

javascript - 500 错误 :expected "indent", 但得到 "newline"

javascript - 来自 Dropdown.Button (antd) 的引用

javascript - 如果图像具有类,则添加类

html - CSS样式导航按钮

html - Magento Community v1.7 类别网格图像大小

c# - 如何为 "Start"和 "Update"等常用函数添加自动完成

javascript - 工厂方法中的数据更改后 AngularJS 范围不更新