FluentValidation不尊重我的CSS类添加

时间:2012-03-03 16:31:01

标签: 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>,它具有验证器认为合适的任何类和input-validation(来自我的资源)。 FluentValidation似乎只是忽略了这个设置。知道如何在FluentValidation生成的范围内添加CSS类选择器吗?

在类似的说明中,例如它产生的输出:

<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没关系但是,属性。

1 个答案:

答案 0 :(得分:0)

因此,我认为首先导致问题的是您的验证扩展方法。它调用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获取更多见解。