2
當調用Validator.TryValidateObject
和validateAllProperties = 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所建議的,我採取的方法是單獨驗證列表中的每個對象。
您是否忽略了IsValid方法?這將告訴它是否有效! – Fals
@Fals是的,如果你看看代碼片斷,你可以看到用IsValid重寫的確切實現。正如應用'TryValidateProperty'時提到的那樣,它可以工作,但不會驗證集合中的對象。 – nealsu
有一個方法public bool IsValid(object value),你應該重寫這個! – Fals