僅當Prop1爲true時,如何在屬性Prop2中使用必需的驗證?如果另一個屬性具有MVC上的值,驗證屬性3/jQuery驗證器
Ex:
public bool Prop1 { get; set; }
[Required] // I need this validation only if the Prop1 is true.
public string Prop2 { get; set; }
任何想法?我需要在客戶端和服務器端。 謝謝
僅當Prop1爲true時,如何在屬性Prop2中使用必需的驗證?如果另一個屬性具有MVC上的值,驗證屬性3/jQuery驗證器
Ex:
public bool Prop1 { get; set; }
[Required] // I need this validation only if the Prop1 is true.
public string Prop2 { get; set; }
任何想法?我需要在客戶端和服務器端。 謝謝
你可以寫一個自定義驗證器做這個工作。
讓我知道如果你需要幫助做到這一點。
這有兩個部分。首先,你必須編寫一個必需的屬性,只有當其他屬性符合你的標準時才需要。
你不得不做這樣的事情:
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'屬性的,但它應該很容易修改成爲必需的比較。
謝謝,但我認爲自定義驗證器是最好的方法。 :) – Cesar 2011-03-21 20:09:45
@Cesar:從CustomValidationAttribute繼承可能是一種方式,所以你不必做反射片,但這篇文章告訴你如何實現服務器端和客戶端「自定義驗證器」。如果你的意思是在客戶端的驗證規則,這裏是對這些的一個很好的解釋:http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html – 2011-03-21 20:30:44
我寫了一篇關於如何在客戶端和服務器上創建自定義DataAnnotations屬性以進行驗證。 [在此閱讀](http://www.ipreferjim.com/2011/08/dataannotations-mvc3-unobtrusive-validations/)和[源代碼](https://github.com/jimschubert/ContainsAttributeExample) – 2012-05-17 13:56:08
你可以使用MVC FoolProof驗證框架
它像
[RequiredIf]
[RequiredIfNot]
[RequiredIfTrue]
[RequiredIfFalse]
[RequiredIfEmpty]
[RequiredIfNotEmpty]
[RequiredIfRegExMatch]
[RequiredIfNotRegExMatch]
[Is]
[EqualTo]
[NotEqualTo]
[GreaterThan]
[LessThan]
[GreaterThanOrEqualTo]
[LessThanOrEqualTo]
希望這會幫助你有用的功能!
CustomValidator適用於WebForms。他在MVC中詢問DataAnnotations。 – 2011-03-21 20:31:48
什麼?你不知道你可以編寫你的自定義驗證器並在MVC中使用它?觀看這個BradWilson演示並學習! http://bradwilson.typepad.com/blog/2011/02/advanced-aspnet-mvc-3-presentation.html – Zote 2011-03-22 12:08:08
我在說'CustomValidator' http://msdn.microsoft.com/en-us/ library/system.web.ui.webcontrols.customvalidator.aspx與添加到jQuery驗證插件的規則不同。通過添加一個驗證提供程序,就像在我的答案中一樣,您正在指定添加的規則。這些由DOM上的jQuery解析就緒。添加單個驗證腳本不像允許DataAnnotations框架爲您生成這些規則那樣靈活或可重複使用。 – 2011-03-22 15:20:37