2011-11-18 107 views
39

私はこれらの2人のヘルパーの違いの説明を見つけることができなかったので、それは明らかなものだと思うだろうが、私は逃した。DropDownlistまたはDropDownListForHtmlヘルパーの違い

基本的に私は次のような単純なモデルで、私は私の場合のために使用すべき1決定しようとしています:

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; } 
    } 

と私はレコードを追加と編集予約のための簡単なルームのDropDownListを表示します。

私はおそらくDropDopwListForが必要だと思われますが、理由と方法は不明です。

+0

良い例をありがとう、感謝し、私の質問は簡単:D。しかし、なぜ誰も私に機器のドロップダウンリストの例を教えてもらえますが、私は部屋の実例を求めていますが、彼らはほとんど同じように動作すると思いますか? –

答えて

76

次の2つの例でください:第二の例でプロパティの名前は、あなたが魔法のようにハードコードされたためにドロップダウンを結合していることは明らかである

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

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

とを文字列。これは、モデルをリファクタリングしてこのプロパティの名前を変更することを意味します。使用している可能性があるツールサポートには、この変更を検出したり、潜在的に多くのビューでハードコードされたマジック文字列を自動的に変更する方法がありません。したがって、この弱い型付きヘルパーが使用されているどこでも手動で&を検索する必要があります。

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

強く型付けされたヘルパーは、ASP.NET MVC 2で初めて導入されました。以前は、弱い型指定のヘルパーを使用した最後の時間が、以前はASP.NET MVC 1アプリケーションで使用されていました。

+0

素晴らしい例:) – kbvishnu

+0

V6用の更新 - あなたは明らかにEquipmentIdという新しいnameofキーワード(nameof(x.EquipmentId))を使用してマジック文字列をバイパスすることができます。 – TomTom

5

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

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

別のコメント:

あなたのビューモデルにICollection<Equipment> Equipmentsを持っていません。 IEnumerable<SelectListItem>を返すプロパティが必要です。

+0

助けてくれてありがとう。しかし、私は実際に部屋のドロップダウンリストを求めています。ちょうどアイデアを得ようとしています。また、DropdownListForについてのビューコードでの例を理解しないでください。 ViewModelにIEnumberable を返すViewModelを追加し、それを予約モデルではなく私のビューにcontrollから返すように提案していますか?私のモデルや、より良いモデルベースで、完全に機能するサンプルベースを提供してください。私は私のモデルに合う実例を見つけることができなかったので、今は立ち往生しています。 –

2

あなたはこのDropDownListまたはDropDownListForが内側になるビュー(aspxファイル)を追加したい、rightclick->はビューを追加しBookingクラスを選択し、リストにし、「強く型付けされたビューを作成します」を選択します。その後、このページを追加します。

次のようにあなたはそれに書くことができます。

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

我々はBookingとして強く型付けされたビューを追加するので、あなたが持つことができます:あなたは

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

を...など

サービスでは、データベースからデータを取得するメソッドを持つことができます。次に、コントローラ内のこのサービスのメソッドを使用して、データベースからビューにデータを渡します。あなたのコントローラでViewDataを使用することができます。それIEnumarableます

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

は、データベースから取得したリストの末尾にAsEnumarable()を置きます。

は、その後、あなたのビューで、あなたも持つことができます。

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

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

私はあなたを助け願っています。

+0

あなたの答えのリンクが死んでいる – dakait

+0

私はViewDataがMVC 3のViewBagに置き換えられたと信じています:http://weblogs.asp.net/scottgu/announcing-asp-net-mvc-3-release-candidate-2 ViewBagは強くViewDataで使用されている文字列とは対照的に、 DropDownListではなくDropDownListForを使用する理由は同じです。 –

2

DropdownListForはラムダ式でサポートされていますので、エラーがあればコンパイル時エラーを表示します。

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

関連する問題