2013-06-24 20 views
2

當調用Validator.TryValidateObjectvalidateAllProperties = true時,我的自定義驗證屬性不會被觸發。 ValidationResult不包含我的錯誤屬性值的條目。以下是用於測試的模型,屬性和代碼。MVC Validator.TryValidateObject不驗證自定義atrribute,validateAllProperties = true

//Model 
public class Model 
{ 
    [AmountGreaterThanZero] 
    public int? Amount { get; set; } 
} 

//Attribute 
public sealed class AmountGreaterThanZero: ValidationAttribute 
{ 
    private const string errorMessage = "Amount should be greater than zero."; 

    public AmountGreaterThanZero() : base(errorMessage) { } 

    public override string FormatErrorMessage(string name) 
    { 
     return errorMessage; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value != null) 
     { 
      if ((int)value <= 0) 
      { 
       var message = FormatErrorMessage(validationContext.DisplayName); 
       return new ValidationResult(message); 
      } 
     } 
     return null; 
    } 

    public override bool IsValid(object value) 
    { 
     if ((int)value < 0) 
     { 
      return false; 
     } 

     return true; 
    } 
} 

//Validation Code 
var container = new Container(); 
container.ModelList = new List<Model>() { new Model() { Amount = -5 } }; 
var validationContext = new ValidationContext(container, null, null); 
var validationResults = new List<ValidationResult>(); 
var modelIsValid = Validator.TryValidateObject(container, validationContext, validationResults, true); 

注:有效性驗證工作有正確的錯誤消息罰款和ValidationResult的回報,如果我使用TryValidateProperty方法。

編輯:正如@Fals所建議的,我採取的方法是單獨驗證列表中的每個對象。

+0

您是否忽略了IsValid方法?這將告訴它是否有效! – Fals

+0

@Fals是的,如果你看看代碼片斷,你可以看到用IsValid重寫的確切實現。正如應用'TryValidateProperty'時提到的那樣,它可以工作,但不會驗證集合中的對象。 – nealsu

+0

有一個方法public bool IsValid(object value),你應該重寫這個! – Fals

回答

2

將@Fals的評論標記爲答案,因爲這是我最終採取的方法。由於沒有其他問題回答,所以滿足了我原來的問題。

@Fals - 這就是問題所在,你必須逐個對象傳遞給validade!