2009-02-24 46 views
6

私はASP MVC RC1を使用しています。Html.DropDownListでデフォルトオプションの値を設定するには

私が使用しているフォームには、このコードで表示されたドロップダウンリストが含まれています。

<%= Html.DropDownList("areaid", (SelectList)ViewData["AreaId"], "Select Area Id")%> 

描画されたときしかし、これは私は、デフォルトで選択されたとして、私が好きな何

<select id="areaid" name="areaid"> 
    <option value="">Select Area Id</option> 
    <option value="1">Home</option> 
    ... 
</select> 

は0の値を持って、それをマークするための選択エリアIDオプションのためである得るものですそれは他の値と一致しており、必須値であるために領域が選択されたかどうかを検証できます。 AreaIdは整数なので、現在ドロップダウンリストに触れずにフォームをクリックすると、MVCは整数ではないと訴え、私にバインディングエラーを与えます。

どのようにデフォルトオプションの値を設定し、それをフォーム上で選択させるのですか?

おかげで、ダン

答えて

21

は、私はあなたが 4つのオプションを持っていると思います。最初にSelectListまたはSelectItemListの列挙型を作成するときは、選択肢の前にオプションラベルとデフォルト値を追加します。他の値がまだモデルで選択されていない場合は、これを先頭に置くとデフォルトになります。次に、オプションを作成するためにループを使用してビュー内に選択(およびオプション)を「手作業で」構築することができます。もう一度、デフォルト選択がモデルで提供されていない場合は、その前に追加します。第3に、DropDownList拡張を使用しますが、ページがロードされた後にjavascriptを使用して最初のオプションの値を変更します。

string.Emptyを使用するようにハードコードされているため、DropDownList拡張を使用してoptionLabelに値を割り当てることはできないようです。関連するコードスニペットはhttp://www.codeplex.com/aspnetです。

// Make optionLabel the first item that gets rendered. 
    if (optionLabel != null) { 
     listItemBuilder.AppendLine(ListItemToOption(new SelectListItem() { Text = optionLabel, Value = String.Empty, Selected = false })); 
    } 

EDIT:最後に、最善の方法は、あなたのモデルがnull許容値を取り、RequiredAttributeを使用して必要に応じてそれをマークすることです。ビューのエンティティモデルではなく、ビュー固有のモデルを使用することをお勧めします。値はNullableなので、空の文字列は値を選択せず​​にポストバックすれば正常に動作します。それを必要な値として設定すると、値が必要であることを示す適切なメッセージでモデルの検証が失敗します。これにより、DropdownListヘルパーをそのまま使用することができます。

public AreaViewModel 
{ 
    [Required] 
    public int? AreaId { get; set; } 

    public IEnumerable<SelectListItem> Areas { get; set; } 
    ... 
} 

@Html.DropDownListFor(model => model.AreaId, Model.Areas, "Select Area Id") 
+1

ありがとうございます。 List オブジェクトを作成し、インデックス0に値0のデフォルトオプションを挿入し、それをHtml.DropDownListに渡します。それは治療に役立ちます。 – Hmobius

+0

私も助けてくれてありがとう! MVC 3でさえ、デフォルト値を追加することはできません。/ – LanFeusT

+0

@LanFeusT - これはMVC3よりずっと前に答え​​られたことは悲しいことです。私はそれをモデルの観点から扱うより良い方法について更新しました。 MVC3で – tvanfosson

3

MVC3の場合、SelectListにはオーバーロードがあり、選択した値を定義できます。この場合

Function Create() As ViewResult 

     ViewBag.EmployeeId = New SelectList(db.Employees, "Id", "Name", 1) 

     Return View() 

    End Function 

、私は1は、私が欲しいのデフォルトのリスト項目のIDであることを知ることが起こりますが、おそらくあなたは、クエリを経由して、デフォルトまたは何今までに、ボートが

+0

これは素晴らしい動作します。ダンの質問に答えるために、 –

0

代わりの通過浮いを選択することができますビュー内の定義からのデフォルト項目、コントローラからリストの0番目のインデックスに "Select Area"データを追加することができます。

この方法では、選択領域データが0

0

のインデックス値を持っている私は、複数のドロップダウンのために同じSelectListのを使用したいと私はちょうど新しいを追加しましたので、モデルでSelectListのを複製したくありませんでしたHtml値を取り込んで選択した項目を設定する拡張メソッド。

public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper, string name, string value, IList<SelectListItem> selectList, object htmlAttributes) 
{ 
    IEnumerable<SelectListItem> items = selectList.Select(s => new SelectListItem {Text = s.Text, Value = s.Value, Selected = s.Value == value}); 
    return htmlHelper.DropDownList(name, items, null /* optionLabel */, htmlAttributes); 
} 
関連する問題