Рендеринг двух частичных просмотров на одной странице

Я могу отобразить список всех клиентов и список всех заказов, и я хотел бы пойти дальше.

Я хотел бы отобразить два частичных представления на одной и той же странице, чтобы показать сведения о клиенте и заказы, относящиеся к этому клиенту.

 <%@ 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.

Где я ошибаюсь?


person Nicholas Murray    schedule 09.10.2009    source источник


Ответы (3)


Конструкторы вашего контроллера принимают только один аргумент, каждый, и вы пытаетесь использовать оба значения в одном экземпляре.

Вы могли бы сделать, например:

ICustomerRepository customerRepository;
IOrderRepository orderRepository;

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

public CustomersController(
    ICustomerRepository customerRepository, 
    IOrderRepository orderRepository)
{
    this.customerRepository = customerRepository;
    this.orderRepository = orderRepository;
}
person Craig Stuntz    schedule 09.10.2009
comment
Вы пробовали образец кода, который я вам дал? Между прочим, спасибо, что разместили столько кода, сколько и вы; это позволило легко обнаружить проблему. - person Craig Stuntz; 09.10.2009
comment
Вы можете решить эту проблему, используя код Крейга, так как он точно такой же, как мой, а мой, конечно, никогда не дает сбоев ;-) - person Razzie; 09.10.2009
comment
Я не знаю. Я думаю, что ваше расположение фигурных скобок могло бы быть немного лучше. :) - person Craig Stuntz; 09.10.2009
comment
Ура, Крейг и Раззи! Теперь он заработал, исправил эту ошибку и угадайте, что? их больше внизу, но я наложил отпечаток на все (пока). - person Nicholas Murray; 09.10.2009

Ну, фабрика контроллеров вызывает контроллер по умолчанию, поэтому вызывается этот конструктор:

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;
}
person Razzie    schedule 09.10.2009

Вы получаете ошибки в частичном представлении, поэтому весь код в контроллерах не имеет значения. Вам нужно увидеть, что именно содержится в вашей модели, и правильно ли вы передаете модель в свое частичное представление. Отладьте его и прервите вызов RenderPartial, затем проверьте модель и просмотрите свое частичное представление, чтобы убедиться, что вы передаете правильные значения.

person Palantir    schedule 09.10.2009