2011-11-04 79 views
3

我想驗證包含在兩個字段中的電話號碼。MVC3驗證多個字段作爲單個屬性

第一個字段顯示區號,另一個字段顯示剩餘的電話號碼數字。

的要求是:

  1. 他們要求兩者。
  2. 它們必須是數字。
  3. 區號字段必須最多爲6位數字,電話號碼字段必須最多爲10位數字。

需要爲這兩個字段顯示單條消息。例如,如果地區代碼丟失但提供了電話號碼,則應在兩個字段後面顯示一條消息,說明「請輸入電話號碼」。

我目前擁有的模式是類似於:

public class Customer 
{ 
    //...other fields here 

    public string AreaCode { get; set; } 

    public string PhoneNumber { get; set; } 
} 

我無法實現電話與正則表達式或simlar單場。

也有同樣的問題,這個here(還有一種類似於here),其中的答案建議創建一個自定義的驗證屬性(在這種情況下,一個名爲MultiFieldRequired)來指定需要哪些屬性中的字段的名稱。驗證屬性然後使用反射來檢查其他屬性的值,以在出現錯誤時進行報告。

例如,在上述模型的情況下,我認爲我應該有:

public class Customer 
{ 
    //...other fields here 

    public string AreaCode { get; set; } 

    [MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")] 
    public string PhoneNumber { get; set; } 
} 

然而,我所遇到的一個小問題,所提供的解決方案。自定義驗證屬性返回的錯誤僅針對具有數據註釋的字段(PhoneNumber是上述模型)進行報告。因此,如果用戶沒有輸入AreaCode,但提供了PhoneNumber,則將針對PhoneNumber字段而不是AreaCode報告錯誤。此外,如果您使用Visual Studio Internet項目提供的css,則提供的PhoneNumber字段將顯示爲紅色,而無效區域代碼顯示爲白色(不顯示錯誤),因此這看起來有點奇怪。

有沒有人有辦法糾正這種着色行爲,或者如果任何一個字段出錯(在字段中使用正確的顏色),我可以報告錯誤消息的方式?

預先感謝您。

回答

3

應用同時在屬性和只有一個ValidationMessageFor(任何人),並把它放在你要顯示的信息(從看來你只需要一個錯誤信息後)。

public class Customer 
{ 
    //...other fields here 

    [MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")] 
    public string AreaCode { get; set; } 

    [MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")] 
    public string PhoneNumber { get; set; } 
} 

查看

<div class="editor-label"> 
     @Html.LabelFor(model => model.AreaCode) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.AreaCode) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.PhoneNumber) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.PhoneNumber) 
     @Html.ValidationMessageFor(model => model.PhoneNumber) 
    </div> 
+1

我不太確定這個例子中的實現是如何工作的。唯一可以實現這個功能的方法是在屬性之上添加屬性,例如'[MultiFieldRequired(new string [3] {「Phone1」,「Phone2」,「Phone3」},ErrorMessage =「Phone#required 「)]'------代碼只接受一個數組。我不確定人們是如何使用這些逗號分隔的字符串並使其工作。 – ganjeii

+0

我同意,語法不允許編譯的東西,ganjeii是正確的 – Gaurav123

1
[MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")] 
public class Customer 
{ 
    //...other fields here 

    public string AreaCode { get; set; } 

    public string PhoneNumber { get; set; } 
} 

Multi字段需要放在類上,而不是單個屬性。如果您查看實現,它將查看傳入的對象並遍歷其屬性。

+0

我不太確定這是正確的嗎?如果你看看上面的文字,斯科特回答說:「這讓我在屬性層面而不是模型層面實現這個......」。此外,在我提供的第二個(類似ish)示例中,Darin Dimitrov給出了屬性級別(電子郵件屬性上方)使用的屬性示例。儘管兩個答案都重複了這些屬性,但我認爲該錯誤旨在以屬性級別報告,而不是模型級別。 – Dangerous

+0

@Dangerous Darin的例子比較好,我會進一步研究一下。但我不明白爲什麼你想在一個屬性上影響其他人時將其定義。 –

+0

Thankyou但我不想在模型級別定義驗證,因爲我想針對屬性(或本例中的屬性組)報告錯誤。我希望任何錯誤消息出現在兩個電話號碼字段的右側(或下方)。由於我還會爲此模型設置其他電話號碼字段,因此使用模型級別驗證很難將錯誤報告給屬性。我相信jquery允許您以這種方式爲用戶驗證定義屬性組(不要在此引用我),但不能使用mvc3數據註釋而不定義自定義數據註釋。 – Dangerous