2014-08-28 91 views
2

我最近意識到RequiredAttribute不適用於枚舉字段。比方說,我有兩個選擇元素,稱爲ddlOfficers和ddlApplicationTypes的窗體都在HtmlHelper方法的幫助下呈現。對於creting ddlOfficers輔助方法如下:如何使RequiredAttribute使用枚舉字段

@Html.DropDownListFor(x => x.OfficerID, Model.Officers, "<Choose>", new { id = "ddlAddressedOfficer" }) 

凡OfficerID是Nullable<int>

對於ddlApplicationTypes我不得不寫的擴展方法,它可以讓我爲枚舉領域創建下拉列表:

@Html.EnumDropDownListFor(x => x.ApplicationType, new { @class = "select-normal" }) 

其中ApplicationType是類型自定義枚舉調用AppType

public Enum AppType{ 
    None=0, 
    Complaint, 
    Query, 
    Suggestion 
    } 

我用RequiredAttribute裝飾了OfficerID和ApplicationType屬性。當我沒有選擇ddlOfficers上的任何內容時,我會在提交時收到驗證警告。但是當我沒有在ddlApplicationType上選擇任何東西時,我沒有收到任何警告。我可能知道問題的原因:如果我比較兩個選擇元素,我可以看到ddlOfficers的第一個選項(選擇)沒有指定值,選擇時導致驗證投訴。但ddlApplicationType的第一個選項的值爲「無」。所以驗證引擎會看到選定的選項有一個值,並且簡單地忽略它。你會建議怎麼做才能使它工作?

編輯:爲了使事情更加清楚地看到這裏有兩個選擇元素的HTML:

<select class="select-normal input-validation-error" data-val="true" data-val-required="Choose the addressed officer" id="ddlOfficers" name="OfficerID"> 
    <option value="">&lt;Choose&gt;</option> 
    <option value="1">Ben Martin</option> 
    <option value="2">Nick Carter</option> 
    <option value="3">Sebastian Van</option> 
</select> 

<select class="select-normal valid" data-val="true" data-val-required="Select the application type" id="ddlApplicationType" name="ApplicationType"> 
    <option selected="selected" value="None">&lt;Choose&gt;</option> 
    <option value="Complaint">Complaint</option> 
    <option value="Query">Query</option> 
    <option value="Suggestion">Suggestion</option> 
</select> 
+2

如果它自己的輔助方法,你可以修改它來生成沒有價值的第一個選項元素 - 這看起來像'<選項值> - 選擇 - '。如果'ApplicationType'是一個帶有[[Required]'屬性的可爲空的枚舉,那麼如果選擇了第一個選項,它應該是無效的。 – 2014-08-28 12:37:59

+0

@StephenMuecke,我希望你發佈這個答案。我跟着你的提示,達到了目標。謝謝。 – 2014-08-28 20:05:52

回答

8

有什麼不對您的自定義幫手。 HTML清楚地顯示已添加所需的數據驗證(data-val-required)。簡單地說,問題是您的枚舉總是有一個可接受的值。你可能不認爲None可以接受,但從枚舉的角度來看,這很好。所以你有兩個選擇:

  1. 添加您自己的自定義驗證,以確保不會被選中None。你需要處理這個客戶端和服務器端,因爲你完全獨立於此。

  2. 如果你可以改變枚舉,你可以刪除None選項,然後只需使用一個可以爲空枚舉在模型/視圖模型屬性,即:

    public AppType? ApplicationType { get; set; } 
    

    然後,需要確認將工作如預期。

+2

只需添加上面Nullable枚舉的工作原理就是它將下拉列表中的默認值更改爲空字符串而不是零值(如果它是普通的非空值枚舉,即int)。一個零的int將通過Required屬性檢查,而一個null(空字符串)的可爲空的int將不會通過。 – 2015-07-03 14:22:42

0
[EnumDataType(typeof(AppType))] 

MSDN Article

+0

「雖然此鏈接可能會回答問題,但最好在此處包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。「 – 2016-11-16 04:41:38