1

我得到了我的 createPlayer 视图。它可以工作并加载我存储的图像。我想在下拉列表中选择一个图像并将该 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 回答