2012-07-18 131 views

回答

2

假设你正在使用的AttributedValidatorFactory和你想禁用验证为家庭控制器上的索引操作的POST动词,你可以写一个自定义的验证工厂:

public class MyAttributedValidatorFactory : AttributedValidatorFactory 
{ 
    private readonly Func<HttpContextBase> _contextAccessor; 
    public MyAttributedValidatorFactory(Func<HttpContextBase> contextAccessor) 
    { 
     _contextAccessor = contextAccessor; 
    } 

    public override IValidator GetValidator(Type type) 
    { 
     var context = _contextAccessor(); 
     var rd = context.Request.RequestContext.RouteData; 
     var action = rd.GetRequiredString("action"); 
     var controller = rd.GetRequiredString("controller"); 

     if (string.Equals("post", context.Request.HttpMethod, StringComparison.OrdinalIgnoreCase) && 
      string.Equals("index", action, StringComparison.OrdinalIgnoreCase) && 
      string.Equals("home", controller, StringComparison.OrdinalIgnoreCase) 
     ) 
     if (type == typeof(MyViewModel)) 
     { 
      return null; 
     } 

     return base.GetValidator(type); 
    } 
} 

将用于以取代您的默认号码Application_Start

FluentValidationModelValidatorProvider.Configure(config => 
{ 
    Func<HttpContextBase> contextAccessor = 
     () => new HttpContextWrapper(HttpContext.Current); 
    config.ValidatorFactory = new MyAttributedValidatorFactory(contextAccessor); 
}); 

然后如果您有以下行为离子主控制器上:

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    ... 
} 

FluentValidation不会踢

+0

我能以某种方式保存验证错误:例如,如果您想验证只为一个特定的规则集运行,那么你可以归咎于这将是验证参数指定规则集名称从之前的提交? – Cipiripi 2012-07-18 16:04:28

+0

呃什么? *以前的提交意味着什么*? HTTP是一种无状态协议。我认为你应该解释你到底想达到什么目的。也许有更好的方法。 – 2012-07-18 16:14:21

+0

我的表单上有两个提交按钮。当第一个被点击时,输入不应该被验证,但是当另一个被点击时,输入应该被验证,并且如果用户再次点击第一个,则应该仍然显示错误消息... – Cipiripi 2012-07-18 16:17:13

0

干草男人你错过fluentvalidation的一些重要的点称为验证定制。

发现这里http://fluentvalidation.codeplex.com/wikipage?title=mvc

验证定制

随着FluentValidation V3可以使用CustomizeValidatorAttribute配置如何验证将会运行。

public ActionResult Save([CustomizeValidator(RuleSet="MyRuleset")] Customer cust) { 
    // ... 
}