MVC DropDownListFor - "Object reference not set to instance of object"

MVC DropDownListFor - "Object reference not set to instance of object"

我的部分视图中的 dropdownlistfor 出现空引用错误。我似乎无法找到我遗漏或做错了什么来获取空对象引用。 型号代码:

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);
    }

部分视图代码:

<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 上下文很好,因为我最近完成了 Add-MigrationUpdate-Database -Verbose .

使用Html.Partial() 不会调用您的服务器方法。它只是呈现局部视图(将主视图中的模型传递给局部视图)并抛出错误,因为 CommonAnimalNamesnull 并且您无法为 [= 初始化新的 SelectList 14=].

将主视图中的代码更改为

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

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

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

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