gpt4 book ai didi

c# - 如何强制 ValidationAttribute 将指定的对象成员标记为无效?

转载 作者:太空宇宙 更新时间:2023-11-03 22:10:33 25 4
gpt4 key购买 nike

我的模型包含一些成员:

public class Address
{
public Street { get; set;}
public City { get; set; }
public PostalCode { get; set; }
}

现在我的 ValidationAttributeIsValid 方法重写如下:

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;
}

问题是:

验证后,我的模型状态仅将模型错误添加到整个 Adress 成员,但我需要将其添加到特定成员,如城市或街道。

如有任何帮助,我们将不胜感激...谢谢!

最佳答案

您可以添加成员姓名!

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来通知client,和服务器端,您可以添加更复杂的业务验证:

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");
}

请注意,当 DataAnnotations 全部有效时,Validate 方法仅调用!

关于c# - 如何强制 ValidationAttribute 将指定的对象成员标记为无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6791064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com