我只是实现了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/

10-12 03:49