概要: 編集しようとしているモデル クラスのプロパティを持つ ViewModel を使用しようとしています。モデルを直接編集するときに MVC スキャフォールディング編集フォームを使用して編集フォームが機能するのを見てきましたが、編集中のモデルを含む ViewModel を使用しようとしています。DropDownList に表示されるフィールドの保存を除いて、すべてが機能します。
説明:
MVC 3 のスキャフォールディング機能を使用して、モデルの編集フォームを作成しようとしました。MVC Music Store チュートリアルでは、これは の編集ページに対して行われAlbum
ますStoreManagerController
。そのページ内には、ジャンルとアーティストの 2 つのドロップダウンがあります。ビューでは、それぞれが次のように見えます:-
<div class="editor-label">
@Html.LabelFor(model => model.GenreId, "Genre")
</div>
<div class="editor-field">
@Html.DropDownList("GenreId", String.Empty)
@Html.ValidationMessageFor(model => model.GenreId)
</div>
私が知る限り、これらのオプションは ViewBag を使用してコントローラーに入力されています。
ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
モデルを直接操作する
私のコードでは、Entity Framework を介して DB に保存されているオブジェクトで同じことを行うことができました。
モデル
public class Season
{
public int SeasonId { get; set; }
public int ClubId { get; set; }
public Club Club { get; set; }
}
コントローラー内のコード
ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", season.ClubId);
意見
<div class="editor-label">
@Html.LabelFor(model => model.ClubId, "Club")
</div>
<div class="editor-field">
@Html.DropDownList("ClubId", String.Empty)
@Html.ValidationMessageFor(model => model.ClubId)
</div>
これはうまくいきます。
ビュー モデルの操作
しかし今、編集中のモデルで使用できるものよりも多くのテキストをページに表示する必要があることに気付きました。編集したモデル (シーズン) と表示したい追加のテキストを使用して、特別なビュー モデルを作成したいと考えていました。
ビューモデル
public class EditSeasonViewModel
{
public string PlayerName {get; set;}
public string SummaryText {get; set;}
public int PlayerId {get; set;}
public Season season {get; set;}
}
私はこれを行い、HttpGet メソッドと HttpPost メソッドが新しい ViewModel を使用するようにコントローラーを変更し、View を新しい ViewModel を受け入れるように変更し、ビュー内のすべての「EditorFor」メソッドを model.season.MyProperty を使用するように変更しました。
コントローラー内のコード
ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", seasonVM.season.ClubId);
ビュー内のコード
<div class="editor-label">
@Html.LabelFor(model => model.season.ClubId, "Club")
</div>
<div class="editor-field">
@Html.DropDownList("ClubId", String.Empty)
@Html.ValidationMessageFor(model => model.season.ClubId)
</div>
HttpPost メソッドをデバッグすると、DropDropList から取得する必要がある ClubId 値を除いて、season のすべての値が適切に存在します。
モデルを直接使用していたときと同じように、ビューの DropDownList をまったく変更していません。
質問:
私の質問は、この新しいEditSeasonViewModel
.
また、コントローラーの HttpGet メソッドの ViewBag.ClubId をビューの DropDownList と一致させ、その値を HttpPost メソッドに戻す方法を教えてください。