2011-08-29 11 views
5

私は自分のデータベースを生成するためにEntity Frameworkのコードファーストを使用していますので、私は次のように定義されたオブジェクトいる:今、私はこのために作成、表示、デフォルトの足場でRazorでASP.NET MVC 3を使用すると、ICollectionを作成ビューに追加する最も効果的な方法は何ですか?

public class Band 
{ 
    public int Id { get; set; } 
    [Required(ErrorMessage = "You must enter a name of this band.")] 
    public string Name { get; set; } 
    // ... 
    public virtual ICollection<Genre> Genres { get; set; } 
} 

を探しているではありません過去の経験から私が期待していることについて、ジャンルに私のフォームを追加しています。

オンラインで見る私はUsing ASP.NET MVC v2 EditorFor and DisplayFor with IEnumerable<T> Generic typesが私が望むものに最も近いと思われますが、ASP.NET MVC 3 Custom Display Template With UIHint - For Loop Required?の場合、RazorとMVC 3で意味をなさないようです。現時点では

私はViewBagにジャンルのリストを追加して、私の作成ビューでそのリストをループしました:まだユーザーは、JavaScriptが無効になっていると、チェックボックスのケースを処理していない社外

@{ 
    List<Genre> genreList = ViewBag.Genres as List<Genre>; 
} 
// ... 
<ul> 
@for (int i = 0; i < genreList.Count; i++) 
{ 
    <li><input type="checkbox" name="Genres" id="[email protected](i.ToString())" value="@genreList[i].Name" /> @Html.Label("Genre" + i.ToString(), genreList[i].Name)</li> 
} 
</ul> 

再チェックする必要があり、実際にこの情報でデータベースを更新すると、私は好きなようにジャンルを出力します。

しかし、これはMVC 3がどれほど良いものになったかに基づいて、気分が悪いです。

MVC 3でこれを処理する最も効果的な方法は何ですか?

答えて

5

私はViewBag経由で私のViewにリストを送りません。代わりに私はviewmodelを使ってこれを行います。例えば、私はこのような何かをした:私は私の見解に入れ

@model IceCream.ViewModels.Toppings.ToppingsViewModel 
<div> 
    @Html.HiddenFor(x => x.Id) 
    @Html.TextBoxFor(x =x> x.Name, new { @readonly="readonly"}) 
    @Html.CheckBoxFor(x => x.IsChecked) 
</div> 

\アイスクリーム\ EditorTemplatesフォルダ:

私はこのようなEditorTemplateを持っています。私はこれを使用して、ユーザーが特定のトッピングを「チェック」できるようにするためのhtmlを表示します。

はその後、私のビューでは、私はこのような何か持っている:

@HtmlEditorFor(model => model.Toppings) 

をし、それは私のviewmodelのトッピングプロパティにトッピングのそれぞれに使用されている私のEditorTemplateにその結果を使用します。

そして私は他のもののうち、トッピングのコレクションを含み、のviewmodel持っている:しかし、私は私の中にあることを行う

私のコントローラでオーバー
public IEnumerable<ToppingsViewModel> Toppings { get; set; } 

を、とりわけ、私は(トッピングを取得ケース)、私のviewmodelのプロパティをそのトッピングコレクションに設定します。 Toppingが以前に選択されていたEditの場合、私はTopingsViewModelのIsCheckedメンバを設定し、対応するチェックボックスをチェックするように設定します。

このようにすると、正しいモデルバインディングが提供され、ユーザーがいくつかのトッピングを確認したときに、コレクションの基礎となるアイテムがその選択を反映するようになりました。私のためにうまくいった、それはあなたのために役立つことを願っています。

+0

申し訳ありませんが、実際にこれを実装する時間を探しています。しかし、それはあなたの答えに追加の文脈を追加するあなたの質問http://stackoverflow.com/q/7155747/11912を指摘する価値があります。 –

関連する問題