2012-03-03 83 views
0

我刚刚实施FluentValidation,除了一个尴尬的小细节外,一切看起来都很棒。FluentValidation不尊重我的CSS类别

@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似乎只是忽略此设置。任何想法如何添加一个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属性,虽然。

回答

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获取更多见解。

+0

我可以提供自己的标签制作者吗?有没有一个标签生成器工厂,我可以注入我自己的版本? – bevacqua 2012-03-07 02:33:04

+0

我在ValidationMessageFor的内容中看到的都不是。标签是围绕着流控制构建的,比如是否启用了不引人注意的JavaScript,但没有其他真正的可扩展性点。 – 2012-03-07 04:16:03