web-dev-qa-db-ja.com

DropDownlistまたはDropDownListFor Htmlヘルパーの違い

これらの2つのヘルパーの違いの説明を見つけることができなかったのは奇妙に思えます。

基本的に、次の単純なモデルを使用して、自分のケースに使用するものを決定しようとしています:

public class Booking
    {
        public int ID { get; set; }
        public Room Room { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }
        public ICollection<Equipment> Equipments { get; set; }
        public string Who { get; set; }
    }

予約レコードを追加および編集するための簡単な会議室ドロップダウンリストを表示します。

たくさんのGoogleを試した後、おそらくDropDopwListForが必要なようですが、理由と方法はわかりませんか?

42
Paul L

次の2つの例を取り上げます。

@Html.DropDownListFor(
    x => x.EquipmentId, 
    new SelectList(Model.Equipments, "Id", "Text")
)

そして:

@Html.DropDownList(
    "EquipmentId", 
    new SelectList(Model.Equipments, "Id", "Text")
)

2番目の例では、ドロップダウンをバインドするプロパティの名前がマジックストリングとしてハードコーディングされていることは明らかです。つまり、モデルをリファクタリングしてこのプロパティの名前を変更する場合、使用している可能性のあるツールサポートには、この変更を検出し、潜在的に多くのビューでハードコーディングしたマジックストリングを自動的に変更する方法がありません。そのため、この弱く型付けされたヘルパーが使用されているすべての場所を手動で検索および置換する必要があります。

一方、最初の例では、指定されたモデルプロパティに関連付けられた厳密に型指定されたラムダ式を使用しているため、コードをリファクタリングすることにした場合、ツールは使用されるすべての場所で自動的に名前を変更できます。また、ビューをプリコンパイルすることにした場合、修正が必要なビューをすぐに指すコンパイラー時間エラーが表示されます。 2番目の例では、サイトのユーザー(理想)またはユーザー(最悪のシナリオ)がこの特定のビューにアクセスすると、ランタイムエラーが発生します。

厳密に型指定されたヘルパーは、ASP.NET MVC 2で最初に導入され、最後に弱い型指定のヘルパーを使用したのは、かなり前にASP.NET MVC 1アプリケーションでした。

85
Darin Dimitrov

DropDownListForは、指定されたプロパティを使用して、選択した値を自動的に選択します。

// Will select the item in model.Equipments that matches Model.EquipmentId
@Html.DropdownListFor(m => m.EquipmentId, Model.Equipments); 

別のコメント:

ビューモデルにICollection<Equipment> Equipmentsを含めないでください。 IEnumerable<SelectListItem>を返すプロパティが必要です。

6
jgauffin

このaspxまたはDropDownListが内部にあるビュー(DropDownListForファイル)を追加する場合は、右クリック->ビューの追加を選択し、[強く型付けされたビューの作成]を選択し、リストでBookingクラスを選択します。その後、このページを追加します。

次のように記述できます。

_@Html.DropdownListFor(m => m.Equipments , Model.Equipments);
_

強く型付けされたビューをBookingとして追加するため、次のことができます。

_m => m.ID, m => m.Room, m => m.StartTime
_

...など.

サービスには、データベースからデータを取得するメソッドがあり、コントローラーでこのサービスのメソッドを使用して、データベースからビューにデータを渡します。コントローラーでViewDataを使用できます。

_ViewData["Equipments"] = new servicename().getdatalistfromdatabase().AsEnumarable();
_

データベースから取得したリストの最後にAsEnumarable()を置くと、IEnumarableになります。

次に、あなたの見解では、あなたも持つことができます:

_@Html.DropdownList("MyEquipments" , ViewData["Equipments"]);
_

ViewDataの使用に関するリンク: http://msdn.Microsoft.com/en-us/library/dd410596.aspx

それがお役に立てば幸いです。

2
cemsazara

DropdownListForは強力な型をサポートし、ラムダ式によって名前が割り当てられるため、エラーがある場合はコンパイル時エラーが表示されます。

DropdownListはこれをサポートしていません。

2
Sabuj Sen