首页 / 网页编程 / ASP.NET / 《ASP.NET MVC验证框架中关于属性标记的通用扩展方法》之继续扩展
        
            《ASP.NET MVC验证框架中关于属性标记的通用扩展方法》之继续扩展2011-10-14 博客园 alby首先需要对xVal有点熟悉:http://www.codeplex.com/xval建议下载最新源码而不是编译版本再看两篇文章:http://goneale.com/2009/03/04/using-metadatatype-attribute-with-aspnet-mvc-xval- validation-framework/深山老林将之翻译为:《ASP.NET MVC验证框架中关于属性标记的通用扩展方法》http://www.cnblogs.com/wlb/archive/2009/12/01/1614209.html现在有个"比较验证"的需求,比如注册帐号时候,需要判断两次输入的密码是否一致,再比如有时候 需要比较输入的值是否大于(小于)某个值或某个html控件的值等等。而深山老林翻译提供的方法并不支持这种方式,原因是是什么呢?进行比较时需要两个属性(或字段),ValidationAttribute如果用在某一个属性上,无法获取该属性所 属的实例,也就无法获取另一个属性值进行比较。(如果可以获取还望一定告知)因此,这里就用基于类的特性校验方式。参考ASP.NET MVC 2 RC Demo 自定义类一个比较ValidationAttribute为StringCompareAttribute只是 简单的比较连个字符串是否相等(完全有必要完善成类似于WebForm的CompareControl的效果):1: [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited =  true)]
2: public class StringCompareAttribute : ValidationAttribute
3: {
4:    public string SourceProperty { get; private set; }
5:   public string  OriginalProperty { get; private set; }
6:
7:   private const string  _defaultErrorMessage = ""{0}" 与 "{1}" 不相等";
8:
9:   public  StringCompareAttribute(string sourceProperty, string originalProperty)
10:     :  base(_defaultErrorMessage)
11:   {
12:     SourceProperty =  sourceProperty;
13:     OriginalProperty = originalProperty;
15:   } 
16:
17:   public override string FormatErrorMessage(string name)
18:    {
19:     return String.Format(CultureInfo.CurrentUICulture,  ErrorMessageString,
20:       SourceProperty, OriginalProperty);
21:   } 
22:
23:   public override bool IsValid(object value)//value这里就不是属性或字 段的值了,而是实体的实例
24:   {
25:     PropertyDescriptorCollection  properties = TypeDescriptor.GetProperties(value);
26:     object sourceProperty  = properties.Find(SourceProperty, true /* ignoreCase */).GetValue(value);
27:      object originalProperty = properties.Find(OriginalProperty, true /* ignoreCase  */).GetValue(value);
28:
29:     return object.Equals(sourceProperty,  originalProperty);
30:   }
31:
32: }
33: