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

标签 c# asp.net asp.net-mvc validation validationattribute

我的模型包含一些成员:

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

现在我已经用 IsValid 方法覆盖了我的 ValidationAttribute ,如下所示:

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

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/

相关文章:

asp.net-mvc - Azure 上的 ASP.NET MVC 5 应用程序不会记录异常

c# - 如何使查询限制 1 linq C# MongoDB (ASP.NET MVC)

c# - 在模式弹出窗口中将文本框添加到面板

c# - double 不能表示任何 2^n 的数字而没有精度问题吗? n 是自然的

c# - WPF按钮命令模式:Interpret to UML diagram to show actors

C# NTLM 哈希计算器

c# - 在 ASP.NET html 表中显示数据

asp.net mvc 4 设置viewbag链接

asp.net - 如何为 Release模式设置debug false

c# - WiX 安装程序在静默和 "normal"模式下启动相同的自定义操作