代码之家  ›  专栏  ›  技术社区  ›  Hal

XVAL,整个类上的数据注释

  •  3
  • Hal  · 技术社区  · 16 年前

    我对一个对象进行了完整的验证,并试图找出处理它的最佳方法。

    考虑到以下类别:

    public class LetterResponse {
     public Guid Id {get;set;}
     public bool SendBlankCart {get;set;}
     public string ToName {get;set;}
     public string ToAddress {get;set;}
    }
    

    我想在持久化类之前使用DataAnnotation和XVal来验证它,但是我有复杂的验证,需要多个属性。

    伪:

    if SendBlankCart {
     - no validation on ToName, ToAddress 
    } else {
     ToName - required.
     ToAddress - required. 
    }
    

    我想做如下注解:

    [LetterResponseValidator]
    public class LetterResponse {
     public Guid Id {get;set;}
     public bool SendBlankCart {get;set;}
     public string ToName {get;set;}
     public string ToAddress {get;set;}
    }
    

    并有这样的验证规则:

    public class LetterResponseValidator : ValidationAttribute
        {
            public override bool IsValid(object value)
            {
                if (value.GetType() == typeof(LetterResponse))
                {
                    var letterResponse = (letterResponse) value;
                    if (letterResponse.SendBlankCard)
                    {
                        return true;
                    } else
                    {
                        if (string.IsNullOrEmpty(letterResponse.FromDisplayName) || string.IsNullOrEmpty(letterResponse.ToAddress1))
                        {
                            return false;
                        }
                        return true;
                    }
    
                }
                return false;
            }
        }
    

    我希望参数是LetterResponse类的实例,但它从未在我的验证运行程序上被调用?

    有人知道怎么处理这个吗?

    谢谢,

    哈尔

    1 回复  |  直到 16 年前
        1
  •  2
  •   Adrian Grigore    16 年前

    我不认为这与你有一个类级验证器的事实有关。若要排除任何连接,请尝试将虚拟必需的验证器应用于“toname”,并查看是否调用了验证器。

    如果正在调用,请告诉我,如果没有,则应检查是否已使用global.asax.cs文件中的dataAnnotationsModelBinder重写了标准ModelBinder:

    ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();
    

    有关此演示项目和完全工作的演示项目的更多详细信息,请阅读以下内容 blog article about client-side validation .