【问题标题】:FluentValidation not honoring my CSS class additionFluentValidation 不尊重我的 CSS 类添加
【发布时间】:2012-03-21 19:21:23
【问题描述】:

我刚刚实现了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 的默认实现,这创建了一个 &lt;span&gt;,它具有验证器认为合适的任何类和 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 属性。

【问题讨论】:

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


    【解决方案1】:

    所以我认为造成麻烦的第一件事是您的验证扩展方法。它调用 ValidationMessageFor,它是 HTML 帮助程序上的 MVC3 扩展,但其签名将匹配传递给它的验证消息:

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

    根据您的代码,我实际上希望错误消息是您资源中的 CSS 类名称,基于来自 &lt;span&gt; 生成方式的这个 sn-p:

    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 了解更多信息。

    【讨论】:

    • 我可以提供自己的标签生成器吗?有没有可以注入我自己的版本的标签生成器工厂?
    • 我在 ValidationMessageFor 胆量中看到的没有。标签是围绕流控制构建的,例如您是否启用了不显眼的 JavaScript,但没有其他真正的扩展点。
    猜你喜欢
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2011-08-05
    • 2015-04-20
    • 2021-03-24
    相关资源
    最近更新 更多