MVC DropDownListFor - “对象引用未设置为对象的实例”

时间:2017-05-14 19:06:55

标签: c# asp.net-mvc asp.net-mvc-5.1

我在部分视图中使用dropdownlist获取了一个null引用错误。我似乎无法找到我遗漏或做错的东西来获得一个空的对象引用。 的 ModelCode:

CommonHerpNames.cs

public class CommonHerpNames
    {
        [Key]
        public int CommonHerpId { get; set; }

        public string HerpName { get; set; }
}

NewReptileViewModel.cs

public class NewReptileViewModel
{
    public IEnumerable<CommonHerpNames> CommonAnimalNames { get; set; }
    public ReptileModel ReptileModel { get; set; }
}

控制器代码:

  public ActionResult _AddReptile()
    {
        var commonAnimalTypes = _context.CommonHerps.ToList();
        var viewModel = new NewReptileViewModel
        {
           CommonAnimalNames = commonAnimalTypes
        };            

        return PartialView("_AddReptile", viewModel);
    }

部分ViewCode:

<div class="form-group">
     @Html.DropDownListFor(model => model.ReptileModel.CommonHerpTypeId, new SelectList(Model.CommonAnimalNames, "CommonHerpId", "HerpName"), "Select Animal")
</div>

主要视图代码:

<div>
    @Html.Partial("_addReptiles")
</div>

为了记录,我知道我的CommonHerps背景很好,因为我最近完成了添加迁移更新数据库-Verbose

1 个答案:

答案 0 :(得分:1)

使用Html.Partial()不会调用您的服务器方法。它只渲染部分视图(将主视图中的模型传递给部分视图)并抛出错误,因为CommonAnimalNamesnull而您无法为{{SelectList初始化null 1}}。

将主视图中的代码更改为

@Html.Action("_AddReptile") // add controller name as 2nd parameter if necessary

@{ Html.RenderAction("_AddReptile"); }

会调用您的_AddReptile()方法,该方法会初始化您的视图模型并设置CommonAnimalNames的值。

您可能还需要考虑使用_AddReptile()属性标记[ChildActionOnly],以防止浏览器调用它。