1

createPlayerビューを取得しました。それは動作し、私が保存した画像をロードします。ドロップダウンで1つの画像を選択し、そのIDをplayerImageIdに保存します。[HttpPost]しかし、作成ボタンを押すと、両方のクラス(画像/プレーヤー)がコントローラーで空になります。

ビューに送信されるモデルは次のとおりです。

public ActionResult CreatePlayer()
{
    var images = db.Image.ToList();
    var playerViewModel = new PlayerViewModel(new Player(), images);
    return View(playerViewModel);
}

ビューは次のようになります。

@model MariedalsIK.Models.PlayerViewModel
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Player</legend>
        <div>
            @Html.LabelFor(model => model.Image)
        </div>
        <div>
            @Html.DropDownListFor(model => model.Image, Model.Image.Select(x => new SelectListItem
                                                                              {
                                                                                  Text = x.ImageName,
                                                                                  Value = x.Id.ToString()
                                                                              }))
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Player.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Player.Name)
            @Html.ValidationMessageFor(model => model.Player.Name)
        </div>

PlayerViewModelは次のようになります。

  public class PlayerViewModel
    {
        public PlayerViewModel(Player player, IEnumerable<Image> images)
        {
            Player = player;
            Image = images;
        }

        public Player Player { get; private set; }
        public IEnumerable<Image> Image { get; private set; }

        public PlayerViewModel()
        {

        }
    }

そして、CreatePlayerアクションは次のようになります。

[HttpPost]
public ActionResult CreatePlayer(PlayerViewModel playerViewModel)
{
    if (ModelState.IsValid)
    {
        db.Player.Add(playerViewModel.Player);
        db.SaveChanges();
        return RedirectToAction("Teams");
    }
    return RedirectToAction("Teams");
}

[HttpPost]次のように、CreatePlayerにプレーヤーを送信するだけで機能するということです。

[HttpPost]
public ActionResult CreatePlayer(Player player)

しかし、その場合、私は.を取得しませんimageId

4

1 に答える 1

2

ビューモデルのプロパティには、プライベートセッターのみがあります。デフォルトのモデルバインダーはそれらの値を設定できません。したがって、ビューモデルを次のように変更します。

public class PlayerViewModel
{
    public Player Player { get; set; }
    public IEnumerable<Image> Image { get; set; }
}

また、ドロップダウンリストが正しくありません。複雑なコレクションプロパティにバインドしようとしています。選択した値を以下にバインドするには、単純なスカラープロパティが必要です。

public class PlayerViewModel
{
    public Player Player { get; set; }

    public IEnumerable<Image> Images { get; set; }
    public string ImageId { get; set; }
}

とビューで:

<div>
    @Html.LabelFor(x => x.ImageId)
</div>
<div>
    @Html.DropDownListFor(
        x => x.ImageId, 
        new SelectList(Model.Images, "Id", "ImageName")
    )
</div>
于 2012-04-23T09:36:13.237 に答える