渲染局部视图时,对象引用未设置为实例

时间:2014-03-03 14:37:59

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

当我尝试渲染不同控制器的局部视图时,获取对象引用异常。

主视图

@model Models.Users

--------
@Html.Partial("~/Views/Address/AddressCreate.cshtml",Model.address)
--------

这是行动

   public ActionResult Create()
    {
        var model = new Users();
        return  View(model);
    }

部分视图

@model Models.Address
<div>@Html.TextBoxFor(m=>m.AddressLine1)</div>

部分视图

  public ActionResult AddressCreate()
    {
        var model = new Address();

        return PartialView(model);
    }

用户和地址类

public class Users
{
 public Address address {get; set;}

 }
 public class Address
  {
      // address objects
  }

2 个答案:

答案 0 :(得分:6)

address模型传递给主视图时,Users模型的public ActionResult Create() { var model = new Users(); model.address = new Address(); return View(model); } 属性似乎为空。

因此,请通过明确初始化来确保不是这种情况:

public class Users
{
    public Users()
    {
        this.address = new Address();
    }

    public Address address { get; set; }
}

或者您可以在模型的构造函数中执行此操作:

AddressCreate

这就是说,我在你的代码中注意到了一些奇怪的事情。您似乎已声明了一些永远不会使用的Html.Partial控制器操作,因为您使用Html.Action帮助器呈现了部分操作。如果你想使用child action渲染部分,那么你肯定应该使用@model Models.Users -------- @Html.Action("AddressCreate") -------- 助手:

AddressCreate

现在将调用Address操作并成功将address模型填充到相应的部分。在这种情况下,您不再需要在主视图模型上显式实例化Html.Partial属性,因为它永远不会被使用。

请确保您了解Html.Action和{{1}}助手之间的差异。

答案 1 :(得分:0)

实际上,代码不会调用AddressCreate,因此从不设置地址视图模型 此外,您的Create方法不会将地址填充到它返回的用户中。

你需要 1)在create方法中填充用户的地址(并删除AddressCreate方法)。

或者

2)在视图中使用Html.Action而不是Html.Partial来调用AddressCreate方法。