代码之家  ›  专栏  ›  技术社区  ›  Abdul Raheem Ghani

ASP.NET MVC 5中的下拉式填充错误

  •  0
  • Abdul Raheem Ghani  · 技术社区  · 5 年前

    我的控制器中有以下内容:

    public ActionResult Create()
    {
        ViewBag.PlayerId = new SelectList(db.Players, "Id", "Name");
        return View();
    }  
    

    这是在视图中:

    <div class="form-group">
        @Html.LabelFor(model => model.PlayerId, "PlayerId", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
                @Html.DropDownList("PlayerId", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.PlayerId, "", new { @class = "text-danger" })
        </div>
    </div>  
    

    但当我提交表格时,它会给我以下错误:

    system.invalidooperationexception:“键为'playerID'的viewdata项的类型为'system.int32',但必须为'ienumerable'类型。”

    我搜了很多东西,但都找不到解决办法。非常感谢你的帮助。

    0 回复  |  直到 5 年前
        1
  •  0
  •   TanvirArjel    5 年前

    写你的 @Html.DropDownList 如下:

    @Html.DropDownList("PlayerId", ViewBag.PlayerId as SelectList,"Select Player", htmlAttributes: new { @class = "form-control" })
    

    现在它可以工作了!

        2
  •  0
  •   Tetsuya Yamamoto    5 年前

    你必须通过 SelectList 但实际上模型绑定器在 PlayerId 作为ViewModel属性和 游戏玩家 作为 ViewBag 属性,从而导致错误。

    最好创建一个viewmodel属性来存储具有不同名称的选项列表:

    public class ViewModel
    {
        public int PlayerId { get; set; }
    
        // other properties
    
        // option list here
        public List<SelectListItem> PlayerList { get; set; }
    }
    

    然后将数据库中的选项列表添加到控制器操作中:

    public ActionResult Create()
    {
        var model = new ViewModel();
        model.PlayerList = db.Players.Select(x => new SelectListItem { Text = x.Name, Value = x.Id }).ToList();
        return View(model);
    }
    

    然后使用强类型助手绑定它:

    @Html.DropDownListFor(model => model.PlayerId, Model.PlayerList, "Select", new { @class = "form-control" })
    

    相关问题:

    The ViewData item that has the key is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'