2012-08-08 141 views
0

我想創建一個MVC模型驗證屬性,填寫以下情況: 我已經創建了幾個模型(生日和PhoneNumber是excellant示例)視圖上的多個輸入字段(月,日,年;區號,交換,後綴)。在ASP.Net嵌套模型的客戶端驗證MVC

public class PhoneNumber 
    { 
    [RegularExpression("^([2-9][0-8][0-9])$", ErrorMessage = "Invalid Area Code")] 
    public virtual string AreaCode { get; set; } 

    [RegularExpression("^([2-9][0-9][0-9])$", ErrorMessage = "Invalid Phone Exchange")] 
    public virtual string Exchange { get; set; } 

    [RegularExpression("^([0-9][0-9][0-9][0-9])$", ErrorMessage = "Invalid Phone Suffix")] 
    public virtual string Suffix { get; set; } 
    } 

我經常將這些模型嵌套在其他模型中(例如,Person具有PhoneNumber和Birthday)。有時候,在我看來,PhoneNumber是必需的,有時不是。 我可以通過將類實現爲IValidatableObject來處理服務器端的這些情況,但是如果我想要執行客戶端驗證,或者甚至只是通過屬性進行服務器端驗證,我會遇到麻煩。

我想我將不得不建立自己的自定義驗證屬性,但我甚至不知道從哪裏開始訪問多個級別上的對象和屬性信息。有沒有人遇到過這樣的事情?任何好的想法都指向正確的方向?

在此先感謝!

--------更新------

通過使用IClientValidatable和GetClientValidationRules,我有機會獲得ModelMetadata可以得到容器的類型。問題在於容器是生日或電話號碼,而不是頂級模型的類型,這是最重要的。 ModelMetadata尚未填充Model屬性,因爲可能還沒有。我真正想要做的是獲得頂級模型的類型。任何人有任何見解?

回答

0

取決於你如何寫你的觀點,我覺得你可能想看看所謂的BeginCollectionItem http://nuget.org/packages/BeginCollectionItem

驗證的擴展變得有點搞砸了,如果你正在做的

@Html.TextBoxFor(m => number.AreaCode) 

,而不是

@Html.TextBoxFor(m => m.AreaCode) 
+0

是的,我已經使用過去的擴展模型綁定到數組。我使用了@ Html.TextBoxFor(m => m.PhoneNumber.AreaCode),或者使用了「RequiredPhoneNumber」類,但是如果我想使用像IPerson這樣的接口並不是特別可擴展的,電話號碼。 – Boomtown 2012-08-09 13:25:11