【问题标题】:Object reference not set to an instance when render partial view渲染局部视图时未将对象引用设置为实例
【发布时间】:2014-03-03 23:00:15
【问题描述】:

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

主视图

@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
  }

【问题讨论】:

  • 为什么你的局部需要控制器动作?

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


【解决方案1】:

当您将Users 模型上的address 属性传递给主视图时,它似乎为空。

所以通过显式初始化来确保不是这种情况:

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 助手渲染了部分。如果您想使用 child action 渲染部分,那么您绝对应该使用 Html.Action 帮助器:

@model Models.Users

--------
@Html.Action("AddressCreate")
--------

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

请确保您了解 Html.PartialHtml.Action 助手之间的区别。

【讨论】:

    【解决方案2】:

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

    您需要 1)在create方法中填充User的地址(去掉AddressCreate方法)。

    或者

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 2013-12-01
      相关资源
      最近更新 更多