如何强制ValidationAttribute将指定的对象成员标记为无效
本文关键字:成员 对象 记为 无效 何强制 ValidationAttribute | 更新日期: 2023-09-27 18:03:02
我有我的模型,其中包含一些成员:
public class Address
{
public Street { get; set;}
public City { get; set; }
public PostalCode { get; set; }
}
现在我已经重写了ValidationAttribute
和IsValid
方法,如下所示:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var input = value as Address;
if (string.IsNullOrEmpty(input.City))
return new ValidationResult("City is required);
if (!string.IsNullOrEmpty(input.PostalCode))
if (string.IsNullOrEmpty(input.Street))
return new ValidationResult("Stret is required");
return ValidationResult.Success;
}
问题是:
验证后,我的模型状态只将模型错误添加到整个address成员,但我需要将它添加到指定的成员,如city或street
对此有任何帮助将不胜感激…谢谢!
您可以添加memberNames !
return new ValidationResult("City is required", new string[] { "City", "Street" });
编辑:我已经测试并找到了一个解决方案:System.ComponentModel.IDataErrorInfo !!这并不适用于javascript客户端,但当提交的结果是我们尝试:)所以继续使用ValidationResult和memberNames和:
public class myModel : System.ComponentModel.IDataErrorInfo
{
private Dictionary<string, List<ValidationResult>> errors;
private bool IsValidated = false;
private void Validate()
{
errors = new Dictionary<string, List<ValidationResult>>();
List<ValidationResult> lst = new List<ValidationResult>();
Validator.TryValidateObject(this, new ValidationContext(this, null, null), lst, true);
lst.ForEach(vr =>
{
foreach (var memberName in vr.MemberNames)
AddError(memberName, vr);
});
IsValidated = true;
}
private void AddError(string memberName, ValidationResult error)
{
if (!errors.ContainsKey(memberName))
errors[memberName] = new List<ValidationResult>();
errors[memberName].Add(error);
}
public string Error
{
get
{
if (!IsValidated)
Validate();
return string.Join("'n", errors
.Where(kvp => kvp.Value.Any())
.Select(kvp => kvp.Key + " : " + string.Join(", ", kvp.Value.Select(err => err.ErrorMessage)))
);
}
}
public string this[string columnName]
{
get
{
if (!IsValidated)
Validate();
if (errors.ContainsKey(columnName))
{
var value = errors[columnName];
return string.Join(", ", value.Select(err => err.ErrorMessage));
}
else
return null;
}
}
和当前属性标记错误,memberNames也是!
: D
编辑2
实际上,您可以保留简单的DataAnnotations来通知客户端,在服务器端,您可以添加更复杂的业务验证:
public class myModel : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (string.IsNullOrEmpty(input.City))
yield return new ValidationResult("City is required",new string[]{"prop1","prop2"});
if (!string.IsNullOrEmpty(input.PostalCode))
if (string.IsNullOrEmpty(input.Street))
yield return new ValidationResult("Stret is required");
}
请注意,只有当数据注释都有效时,Validate方法才会被调用!
需要使用ValidationResult
类的这个构造函数。如
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var input = value as Address;
if (string.IsNullOrEmpty(input.City))
return new ValidationResult("City is required", new List<string>(){"City"});
if (!string.IsNullOrEmpty(input.PostalCode))
if (string.IsNullOrEmpty(input.Street))
return new ValidationResult("Stret is required", new List<string>(){"Street"});
return ValidationResult.Success;
}