2011-01-12 3 views
17

私のビューモデルは、コンボボックスとして表示する必要があるプロパティを定義します。プロパティ定義は次のとおりです。DropDownListで必要な選択を検証する

[Required] 
public int Processor { get; set; } 

私はコンボボックスをレンダリングするDropDownListForを使用しています。今、私は追加する必要が

var noSelection = new SelectListItem 
    { 
    Text = String.Empty, 
    Value = "0" 
    }; 

<%=Html.DropDownListFor(r => r.Processor, Model.Processors, Model.Processor)%> 

Model.Processorsは、として定義された1つの特別なアイテムにIEnumerable<SelectListItem>が含まれています私のコンボボックスへの検証は、ユーザーが別の値を選択してから 'noSelection'を選択する必要があります。私はRequiredAttributeの設定を望んでいましたが、デフォルト値の設定はありません。

+0

あなたはオプションのリストに追加した理由を、ユーザが「NOSELECTION」を選択することになっていない場合は? – Clicktricity

+5

彼に選択を強制する。 –

+2

最初のオプションとして空白が必要な場合は、Html.DropDownListForのオーバーロードを使用します。これは、文字列をプロンプト値として受け取ります。Html.DropDownListFor(r => r.Processor、Model.Processors、Model.Processor、String.Empty )必要な検証が機能するはずです – Clicktricity

答えて

25

これはどう:

[Required] 
public int? Processor { get; set; } 

そして:

<%= Html.DropDownListFor(
    x => x.Processor, Model.Processors, "-- select processor --" 
) %> 

そして、あなたのPOSTアクション

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // the model is valid => you can safely use model.Processor.Value here: 
     int processor = model.Processor.Value; 
     // TODO: do something with this value 
    } 
    ... 
} 

そして今、あなたは、もはや手動noSelection項目を追加する必要がありますインチちょうど適切なDropDownListForの過負荷を使用してください。

+1

ニース、私は完全にその過負荷を誤解しました。ありがとう。 –

+5

これはクライアント側では検証されません:( –

+0

これは私のために働く...完璧なので、デフォルト値を直接モデルに追加するのではなく、直接オーバーロードで追加します。 – Legends

関連する問題