【问题标题】:Rendering two Partial Views on the same Page在同一页面上渲染两个局部视图
【发布时间】:2009-10-09 14:45:22
【问题描述】:

我可以显示所有客户的列表,我可以显示所有订单的列表,我想更进一步。

我想在同一页面上呈现两个部分视图,以显示与该客户相关的客户详细信息和订单。

 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage< MyDemo.Models.CustomerAndOrdersViewModel >" %>

<% Html.RenderPartial("CustomerDetails", this.ViewData.Model.Customer); %>
<% Html.RenderPartial("CustomerOrders", this.ViewData.Model.Order); %>

我已经创建了一个视图模型

public class CustomerAndOrdersViewModel
{
    public CustomerAndOrdersViewModel(Customer customer,
                        IEnumerable<Order> orders)
    {
        this.Customer = customer;
        this.Order = orders;
    }

    public Customer Customer { get; set; }
    public IEnumerable<Order> Order { get; set; }
}

在我的客户控制器中我已经定义了

    ICustomerRepository customerRepository;
    IOrderRepository orderRepository;

    public CustomersController()
        : this(new CustomerRepository())
    {
    }

    public CustomersController(ICustomerRepository repository)
    {
        customerRepository = repository;
    }

    public CustomersController(IOrderRepository repository)
    {
        orderRepository = repository;
    }

然后我尝试将 CustomerAndOrdersViewModel 传递给详细信息视图

    public ActionResult Details(int id)
    {

        QuestionAndOrderViewModel viewdata = new CustomerAndOrdersViewModel(customerRepository.GetCustomer(id),
                                        orderRepository.FindAllOrders());
        return View(viewdata);
    }

但我收到 orderRepository 的错误“对象引用未设置为对象的实例”。

我哪里出错了?

【问题讨论】:

    标签: asp.net-mvc partial-views


    【解决方案1】:

    您的控制器的构造函数每个只接受一个参数,并且您试图在同一个实例中使用这两个值。

    你可以这样做,例如:

    ICustomerRepository customerRepository;
    IOrderRepository orderRepository;
    
    public CustomersController()
        : this(new CustomerRepository(), new OrderRepository())
    {
    }
    
    public CustomersController(
        ICustomerRepository customerRepository, 
        IOrderRepository orderRepository)
    {
        this.customerRepository = customerRepository;
        this.orderRepository = orderRepository;
    }
    

    【讨论】:

    • 你试过我给你的代码示例了吗?顺便说一句,感谢您发布尽可能多的代码;它使问题很容易被发现。
    • 您可以使用 Craig 的代码来解决它,因为他的代码和我的完全一样,当然我的永远不会失败 ;-)
    • 我不知道。我认为您对花括号的定位可能会更好一些。 :)
    • 干杯克雷格和拉齐!现在让它工作了,解除了那个错误,你猜怎么着?下面还有更多,但我已经在所有这些上加盖了(现在)。
    【解决方案2】:

    嗯,控制器工厂调用的是默认控制器,所以调用了这个构造函数:

    public CustomersController() : this(new CustomerRepository())
    {
    }
    

    请注意,您只传递了一个 CustomerRepository 对象,而不是一个角色存储库。所以把你的代码改成:

    ICustomerRepository customerRepository;
    IOrderRepository orderRepository;
    
    public CustomersController() : this(new CustomerRepository(), new OrderRepository())
    {}
    
    public CustomersController(ICustomerRepository customerRepository, IOrderRepository orderRepository)
    {
      this.customerRepository = customerRepository;
      this.orderRepository = orderRepository;
    }
    

    【讨论】:

      【解决方案3】:

      您在局部视图中遇到错误,因此控制器中的所有代码都无关紧要。您需要查看模型中确切包含的内容,以及是否将正确的模型传递给局部视图。调试它并在 RenderPartial 调用时中断,然后检查模型,并查看您的局部视图以查看您是否传递了正确的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多