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