2011-03-21 49 views

回答

0

你可以寫一個自定義驗證器做這個工作。

讓我知道如果你需要幫助做到這一點。

+0

CustomValidator適用於WebForms。他在MVC中詢問DataAnnotations。 – 2011-03-21 20:31:48

+1

什麼?你不知道你可以編寫你的自定義驗證器並在MVC中使用它?觀看這個BradWilson演示並學習! http://bradwilson.typepad.com/blog/2011/02/advanced-aspnet-mvc-3-presentation.html – Zote 2011-03-22 12:08:08

+2

我在說'CustomValidator' http://msdn.microsoft.com/en-us/ library/system.web.ui.webcontrols.customvalidator.aspx與添加到jQuery驗證插件的規則不同。通過添加一個驗證提供程序,就像在我的答案中一樣,您正在指定添加的規則。這些由DOM上的jQuery解析就緒。添加單個驗證腳本不像允許DataAnnotations框架爲您生成這些規則那樣靈活或可重複使用。 – 2011-03-22 15:20:37

4

這有兩個部分。首先,你必須編寫一個必需的屬性,只有當其他屬性符合你的標準時才需要。

你不得不做這樣的事情:

public class RequiredComparerAttribute : RequiredAttribute 
{ 
    public OtherProperty { get; set; } 
    public override bool IsValid(object value) 
    { 
     // TODO: use reflection to validate other property as PropertyInfo 
     // or validate it's value after it is decided to be valid 

     foreach (ValidationAttribute va in property 
      .GetCustomAttributes(typeof(ValidationAttribute), true) 
      .OfType<ValidationAttribute>()) 
     { 
      if (!va.IsValid(value)) 
      { 
       return false; // not required 
      } 
     } 
     return true; // required 
    } 
} 

然後,在的Application_Start在Global.asax,你必須註冊驗證,您可以只重用RequiredAttribute標籤的驗證:

 DataAnnotationsModelValidatorProvider 
      .RegisterAdapter(typeof(RequiredComparerAttribute), 
       typeof(RequiredAttributeAdapter)); 

如果你想添加你自己的驗證器,你必須編寫一個自定義驗證器。 Phil Haack在他的博客上有一個例子:http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

編輯:看看.NET Reflector中的CompareAttribute,瞭解如何獲取OtherProperty的值。 CompareAttribute也實現了IClientValidatable來提供客戶端所需的驗證規則。

不要認爲CompareAttribute會適用於您,因爲您必須驗證是否需要根據另一個屬性的內容值,而不是比較兩個屬性的相等性。

編輯2:驗證提供程序是做什麼的?

它將規則添加到窗體併爲這些規則提供消息。你可以看到RequiredAttributeAdapter是如何通過下載MVC 3源來完成的。要了解它的客戶端,你可以打開谷歌瀏覽器的MVC 3頁,按CTRL + SHIFT + J彈出一個開發者工具窗口,然後輸入:

$('form:first').data().unobtrusiveValidation.options 

規則對象中指定的選項如何驗證每個項目,並且消息對象指定將針對每個驗證錯誤顯示的錯誤消息。

EDIT3:完整的示例

因爲回答這個問題,我已經寫了一篇博客文章與客戶端(不顯眼的驗證)和服務器上創建一個自定義屬性的一個完整的例子。博客文章是here。這個例子是針對'contains'屬性的,但它應該很容易修改成爲必需的比較。

+0

謝謝,但我認爲自定義驗證器是最好的方法。 :) – Cesar 2011-03-21 20:09:45

+0

@Cesar:從CustomValidationAttribute繼承可能是一種方式,所以你不必做反射片,但這篇文章告訴你如何實現服務器端和客戶端「自定義驗證器」。如果你的意思是在客戶端的驗證規則,這裏是對這些的一個很好的解釋:http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html – 2011-03-21 20:30:44

+0

我寫了一篇關於如何在客戶端和服務器上創建自定義DataAnnotations屬性以進行驗證。 [在此閱讀](http://www.ipreferjim.com/2011/08/dataannotations-mvc3-unobtrusive-validations/)和[源代碼](https://github.com/jimschubert/ContainsAttributeExample) – 2012-05-17 13:56:08

7

你可以使用MVC FoolProof驗證框架

它像

[RequiredIf] 
[RequiredIfNot] 
[RequiredIfTrue] 
[RequiredIfFalse] 
[RequiredIfEmpty] 
[RequiredIfNotEmpty] 
[RequiredIfRegExMatch] 
[RequiredIfNotRegExMatch] 

[Is] 
[EqualTo] 
[NotEqualTo] 
[GreaterThan] 
[LessThan] 
[GreaterThanOrEqualTo] 
[LessThanOrEqualTo] 

希望這會幫助你有用的功能!