5

Entity Framework Code First を使用してデータベースを生成しているため、次のように定義されたオブジェクトがあります。

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ごとにRazorおよびおそらくMVC 3では意味がないようです。 UIHint を使用した NET MVC 3 カスタム表示テンプレート - For ループが必要ですか? .

現在、ジャンルのリストを ViewBag に追加してから、作成ビューでそのリストをループします。

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

ユーザーが JavaScript を無効にしてチェックボックスを再チェックする必要があるケースをまだ処理しておらず、実際にこの情報でデータベースを更新すると、希望どおりにジャンルが出力されます。

しかし、MVC 3 がどれだけ優れたものになったかを考えると、これは正しくないと感じます。

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

4

1 に答える 1

5

ViewBagを介してリストをビューに送信しません。代わりに、ビューモデルを使用してこれを行います。たとえば、私は次のようなことをしました。

私はこのようなEditorTemplateを持っています:

@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>

これをViews\IceCream\EditorTemplatesフォルダーに入れました。これを使用して、ユーザーが特定のトッピングを「チェック」できるようにするためのhtmlを表示します。

それから私の見解では、私はこのようなものを持っています:

@HtmlEditorFor(model => model.Toppings)

その結果、ViewmodelのToppingsプロパティの各トッピングにEditorTemplateが使用されます。

そして、特にトッピングコレクションを含むビューモデルがあります。

public IEnumerable<ToppingsViewModel> Toppings { get; set; }

コントローラーでは、特にトッピングを取得し(ただし、私の場合はこれを行います)、ビューモデルのプロパティをそのトッピングのコレクションに設定します。以前にトッピングが選択されている可能性がある編集の場合、TopingsViewModelのIsCheckedメンバーを設定すると、対応するチェックボックスがオンに設定されます。

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

于 2011-08-29T13:37:36.730 に答える