2010-09-02 70 views
4

示例: 我們有一個條件字段。 此條件字段是一個單選按鈕,其中包含以下兩個值「是」和「否」。 可以說這個單選按鈕的名字是「AAA」。MVC2:具有兩個字段依賴性的驗證(數據註釋)

只有當另一個單選按鈕字段「BBB」設置爲「是」時,才應顯示此條件字段「AAA」。 (單選按鈕「BBB」的值也是「是」和「否」)。

但條件字段「AAA」應該顯示爲沒有預設值,當字段第一次顯示時應該設置爲「是」和「否」。

問題根據當(無條件)字段「BBB」設置爲「是」時只需要條件字段「AAA」的要求發生 - 當字段「BBB」爲「設置爲「否」。

(聲音,我沒有聽到任何關於if語句,還是?但是堅持下去,繼續閱讀...)

相信我,它不會是爲我解決這個題目有問題當我們將使用「的ModelState」 - 但我們在這裏談論的驗證(數據註釋),看起來像這樣的位置:

public class Input1FormModel 
{ 
    [Required(ErrorMessageResourceName="Error_Field_AAA_Empty", 
       ErrorMessageResourceType=typeof(Resources.MyDialog))] 
    public int AAA { get; set; } 
} 

我完全理解也是這些代碼行 - 我相信;-)

...

//property limits 
public int UpperBound { get { return DateTime.Now.Year; } } 
public int LowerBound { get { return 1900; } } 

...

[NotNullValidator] 
[PropertyComparisonValidator("LowerBound", ComparisonOperator.GreaterThan)] 
[PropertyComparisonValidator("UpperBound", ComparisonOperator.LessThanEqual)] 
public int? XYZ { get; set; } 

但是,如何解決上述的依賴(AAA < - > BBB)?

將「return DateTime.Now.Year;」更改爲一個函數調用,它首先檢查另一個字段並返回true或false?但如何獲取其他領域的價值?

回答

1

您可能需要使用IDataErrorInfo。

this question,在那裏我回答了這個:

退房IDataErrorInfo這個問題我問了一下IDataErrorInfo vs. DataAnnotations

+0

thx 4 u很快回復。你是對的。該教程說:「例如,您可能需要執行一個驗證規則,該規則取決於Movie類的多個屬性的值」...因此可能的。解決這個問題的另一種方法是使用Modelstate,正如我在原始發佈中所說的那樣...但目標是使用[Required ...]或[PropertyComparisonValidator(「LowerBound」,ComparisonOperator.GreaterThan)]等屬性...所以最後是不是我的解決方案:-)可能是這不能解決與屬性...其他人有什麼想法嗎?但不要誤會我:謝謝你的回覆/答案! – user415876 2010-09-02 19:48:59

+0

我只是試圖給你一種替代方法,因爲我不知道用什麼方法來做你要求使用的屬性。在這裏,看看這個問題/答案:http://stackoverflow.com/questions/1511495/using-idataerrorinfo-in-asp-net-mvc/1511545#1511545 – Martin 2010-09-02 20:14:29

+0

馬丁,相信我。我非常感謝您的快速回復和非常好的答案!對不起,我在回覆中使用了錯誤的單詞。這不是我的方式來侮辱你。 – user415876 2010-09-04 08:01:45

0

您可以使用數據註釋來執行此操作,但註釋需要在類級別上運行,而不是在屬性級別上運行,因爲驗證屬性僅適用於單個屬性。

這是我創建的一個例子,因爲郵政編碼是可選的,如果人們說他們在新西蘭時不需要,但在澳大利亞是強制性的。此複合驗證將整個模型作爲輸入值,並使用反射來比較從數據註釋傳入的屬性名稱的值。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public class NZPostcodeAttribute : ValidationAttribute 
{ 
    public const string _defaultErrorMessage = "Postcode and State are required for Australian residents"; 
    private readonly object _typeId = new object(); 

    public NZPostcodeAttribute(string countryProperty, string postcodeProperty, string stateProperty) 
    { 
     CountryProperty = countryProperty; 
     PostcodeProperty = postcodeProperty; 
     StateProperty = stateProperty; 
    } 

    public string CountryProperty { get; private set; } 
    public string StateProperty { get; private set; } 
    public string PostcodeProperty { get; private set; } 

    public override object TypeId 
    { 
     get 
     { 
      return _typeId; 
     } 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return _defaultErrorMessage; 
    } 

    public override bool IsValid(object value) 
    { 
     PropertyDescriptorCollection props = TypeDescriptor.GetProperties(value); 
     object countryValue = props.Find(CountryProperty, true).GetValue(value); 
     object postcodeValue = props.Find(PostcodeProperty, true).GetValue(value); 
     object stateValue = props.Find(StateProperty, true).GetValue(value); 

     string countryString = countryValue == null ? "" : countryValue.ToString(); 
     string postcodeString = postcodeValue == null ? "" : postcodeValue.ToString(); 
     string stateString = stateValue == null ? "" : stateValue.ToString(); 


     bool isValid = true; 

     if (countryString.ToString().ToLower() == "australia") 
     { 
      if (String.IsNullOrEmpty(postcodeString) || String.IsNullOrEmpty(stateString)) 
      { 
       isValid = false; 
      } 
     } 
     if (!String.IsNullOrEmpty(postcodeString)) 
     { 
      string isNumeric = "^[0-9]+"; 
      if (!Regex.IsMatch(postcodeString, isNumeric)) 
       isValid = false; 
     } 
     return isValid; 
    } 
} 

當你想這個應用到你的模型,它需要在模型上的一流水平進行(見頂部的標誌AttributeTargets.Class)。

做它,如下所示:

[NZPostcode("Country", "Postcode", "State")] 
public class UserRegistrationModel 
{.... 

您需要將驗證屬性的屬性名稱。也可以添加客戶端驗證,但這將是一個完整的文章。

您可以輕鬆地將上述內容適應您的情況。