2012-04-23 59 views
1

我得到了我的createPlayer视图。它工作并加载我存储的图像。我想在下拉列表中选择一张图片并将该ID存储在我的playerImageId中。但是当按下创建按钮时,[HttpPost]控制器中的两个类(图像/播放器)都是空的。创建对象时,我的类在viewModel中为空/空。 MVC,EF

模型,在发送给看法是这样的:

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

回答

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>