7

概要: 編集しようとしているモデル クラスのプロパティを持つ 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 メソッドに戻す方法を教えてください。

4

3 に答える 3

12

DropDownList間違っているのはあなたの宣言です。代わりにこれを試してください:

@Html.DropDownListFor(m => m.season.ClubId, ViewBag.ClubId)

しかし、実際には、その選択リストをモデルに配置する必要があります。

public SelectList Clubs { get; set; }

次に、コントローラーに入力します。

Model.Clubs = new SelectList(clubs, "ClubId", "Name", season.ClubId);

次に、次のことができます。

@Html.DropDownListFor(m => m.season.ClubId, Model.Clubs)
于 2013-03-20T12:27:25.660 に答える
3

アクション メソッドからビューにデータを転送するために、ViewBag/ViewData などの動的なものを使用しないでください。強く型付けされたアプローチに切り替えます。

Viewmodel を更新して、さらに 2 つのプロパティを追加します。1 つは利用可能なクラブのコレクションを保持し、もう 1 つは選択されたクラブを保持します。

public class EditSeasonViewModel
{
    public List<SelectListItem> Clubs { set;get;}
    public int SelectedClub { set;get;}

    public string PlayerName {get; set;}
    public string SummaryText {get; set;}
    public int PlayerId {get; set;}
    public Season season {get; set;}

    public EditSeasonViewModel()
    {
        Clubs=new List<SelectListItem>();
    }
}

GET アクションで、クラブを取得してClubsプロパティにロードします。

public ActionResult create(int id)
{
  var vm=new EditSeasonViewModel();
  vm.Clubs=GetListOfSelectListItemFromClubsFromSomeWhere();
  return View(vm);
}

仮定GetListOfSelectListItemFromClubsFromSomeWhereは、クラブの SelectListItem のリストを返すメソッドです

public List<SelectListItem> GetListOfSelectListItemFromClubsFromSomeWhere()
{
  // to do : return List<SelectListItem> with Value and Text(ClubId Id & Name)
}

あなたの見解では、Html.DropDownListForヘルパーメソッドを使用してください

@model EditSeasonViewModel
@using(Html.Beginform())
{

  @Html.DropdownlistFor(x=>x.SelectedClub,
                          new SelectList(Model.Clubs,"Value","Text"),"select")
  <input type="submit" />
}

SelectedClubこのフォームが投稿されると、投稿されたモデルのプロパティで選択したクラブの ID が取得されます。

[HttpPost]
public ACtionResult Create(EditSeasonViewModel model)
{
  if(ModelState.IsValid)
  {
   int clubId= model.SelectedClub;
   //to do : save and redirect (PRG pattern)
  }
  vm.Clubs=GetListOfSelectListItemFromClubsFromSomeWhere();
  return View(model);
}
于 2013-03-20T12:38:43.903 に答える
0

編集/作成アクション コントローラーで、プロパティが正しくバインドされていることを確認してください。

public async Task<ActionResult> Edit([Bind(Include = "SeasonId,ClubId, otherproperties"]){
// code ...
}
于 2015-05-23T09:15:22.780 に答える