快速业务通道

《ASP.NET MVC验证框架中关于属性标记的通用扩展方法》之继续扩展

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

首先需要对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:

为了简单起见,实体类就不用伙伴类了:

1: [StringCompare("PasswordConfirm", "Password", ErrorMessage = "两次输入的密 码不一致")]
2: public class User
3: {
4:   [Required(ErrorMessage = "用户 名不能为空")]
5:   public string UserName { get; set; }
6:
7:    [Required(ErrorMessage = "密码不能为空")]
8:   public string Password { get;  set; }
9:
10:   [Required(ErrorMessage = "确认密码不能为空")]
11:   public  string PasswordConfirm { get; set; }
12: }
13:

现在直接用xVal的校验方式就不行了。

需要改成

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号