2016-08-18 18 views
0

我一般都是FluentValidation的新手。我寫了一個驗證器,我似乎無法弄清楚如何使用WarningMessage而不是ErrorMessage來完成.WithMessage並使用參數。使用帶有WarningMessage參數的FluentValidation的WithMessage方法

我可以這樣做:

RuleFor(x => x.Endorsement) 
      .Must((coverage, endorsement) => HaveCoveragePerAcreOverMinimum(_coverage, coverage)) 
      .When(x => (!HaveSpecialRequest(_coverage) && !HavePermissionsToOverrideLimits())) 
      .WithMessage("Some error message {0}", x => x.MyError); 

但是,將其設置爲一個的ErrorMessage,我需要一個警告消息。我試過,但沒有骰子:

RuleFor(x => x.Endorsement) 
      .Must((coverage, endorsement) => HaveCoveragePerAcreOverMinimum(_coverage, coverage)) 
      .When(x => (!HaveSpecialRequest(_coverage) && !HavePermissionsToOverrideLimits())) 
      .WithMessage(new WarningMessage("Some warning message {0}", x => x.MyError)); 

回答

0

驗證(一般)重視錯誤的ModelState中 - 這本身就是一個對象,因此,如果你把一個破發點上,如果(ModelState.IsValid)線,你可以看看在ModelState的其他屬性中。

有錯誤(和錯誤消息)的東西他們是否存在或沒有。如果沒有問題,則沒有錯誤消息,如果有問題,則會添加錯誤消息。

如果我是你,如果模型狀態無效,在你的控制器我會用

​​

讓所有的錯誤信息,然後遍歷每一個決定你想用它做什麼。

我希望這個答案或至少有幫助,因爲我不完全確定你在問什麼/試圖去。

0

在FluentValidation(或Mvc的ModelState)中沒有直接實現警告消息。

在FluentValidation中,您有一個可用於此目的的 WithState()擴展方法。

首先,你可以創建一個枚舉

public enum ValidationErrorLevel 
    { 
     Error, 
     Warning 
    } 

然後,你可以寫一些擴展方法,在一個靜態類,使用警告和錯誤。

一個在你的驗證器類

public static IRuleBuilderOptions<T, TProperty> AsWarning<T, TProperty>(this IRuleBuilderOptions<T, TProperty> rule) 
{ 
    return rule.WithState<T, TProperty>(x => ValidationErrorLevel.Warning); 
} 

使用您可以使用這種方式

RuleFor(x => x.Endorsement) 
      .Must((coverage, endorsement) => HaveCoveragePerAcreOverMinimum(_coverage, coverage)) 
      .When(x => (!HaveSpecialRequest(_coverage) && !HavePermissionsToOverrideLimits())) 
      .WithMessage("Some error message {0}", x => x.MyError) 
      .AsWarning(); 

很少有其他用於管理您的驗證結果

public static IList<ValidationFailure> GetWarnings(this ValidationResult result) 
{ 
    return result.Errors.Where(m => m.CustomState != null && Convert.ToInt32(m.CustomState) == (int)ValidationErrorLevel.Warning).ToList(); 
} 

public static IList<ValidationFailure> GetErrors(this ValidationResult result) 
{ 
    return result.Errors.Except(result.GetWarnings()).ToList(); 
} 

然後,應該使用

validator.Validate(<someclass>) 

代替

validator.ValidateAndThrow(<someclass>) 




var results = validator.Validate(<someclass>); 

然後,您可以把誤差的ModelState,例如

foreach (var error in result.GetErrors()) { 
    ModelState.AddModelError(error.PropertyName, error.ErrorMessage); 
} 

,並做了警告別的東西,例如把它的TempData

TempData["warnings"] = new List<string>(); 
((List<string>)TempData[WarningMessageKey]).AddRange(result.GetWarnings().Select(warning => warning.ErrorMessage)); 

然後,您可以像其他任何TempData一樣顯示它們。