2012-07-18 62 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) { 
    // ... 
}