Почему FubuMVC является новой () моделью моего представления в PartialForEach?

Я начинаю с FubuMVC, и у меня есть простое отношение Клиент -> Заказ, которое я пытаюсь отобразить, используя вложенные партиалы. Мои доменные объекты выглядят следующим образом:

public class Customer
{
    private readonly IList<Order> orders = new List<Order>();

    public string Name { get; set; }
    public IEnumerable<Order> Orders
    {
        get { return orders; }
    }

    public void AddOrder(Order order)
    {
        orders.Add(order);
    }
}

public class Order
{
    public string Reference { get; set; }
}

У меня есть следующие классы контроллера:

public class CustomersController
{
    public IndexViewModel Index(IndexInputModel inputModel)
    {
        var customer1 = new Customer { Name = "John Smith" };
        customer1.AddOrder(new Order { Reference = "ABC123" });

        return new IndexViewModel { Customers = new[] { customer1 } };
    }
}

public class IndexInputModel
{
}

public class IndexViewModel
{
    public IEnumerable<Customer> Customers { get; set; }
}

public class IndexView : FubuPage<IndexViewModel>
{
}

public class CustomerPartial : FubuControl<Customer>
{
}

public class OrderPartial : FubuControl<Order>
{
}

IndexView.aspx: (урезанный стандартный HTML-материал)

<div>
    <%= this.PartialForEach(x => x.Customers).Using<CustomerPartial>() %>
</div>

CustomerPartial.ascx:

<%@ Control Language="C#" Inherits="FubuDemo.Controllers.Customers.CustomerPartial" %>
<div>
    Customer
    Name: <%= this.DisplayFor(x => x.Name) %> <br />    
    Orders: (<%= Model.Orders.Count() %>) <br />

    <%= this.PartialForEach(x => x.Orders).Using<OrderPartial>() %>
</div>

OrderPartial.ascx:

<%@ Control Language="C#" Inherits="FubuDemo.Controllers.Customers.OrderPartial" %>
<div>
    Order <br />
    Ref: <%= this.DisplayFor(x => x.Reference) %>
</div>

Когда я просматриваю Клиенты / Индекс, я вижу следующее:

Customers 
Customer Name: John Smith 
Orders: (1) 

Похоже, что в CustomerPartial.ascx выполнение Model.Orders.Count() правильно обнаруживает, что существует 1 ордер. Однако PartialForEach(x => x.Orders) нет, так как для заказа ничего не отображается. Если я устанавливаю точку останова в конструкторе Order, я вижу, что он первоначально вызывается методом Index в CustomersController, но затем он вызывается FubuMVC.Core.Models.StandardModelBinder.Bind, поэтому FubuMVC и его повторное создание потерять содержимое коллекции заказов.

Это не совсем то, что я ожидал, я бы подумал, что PartialForEach просто передаст объект домена непосредственно в частичное. Я где-то упускаю суть? Каков "правильный" способ достижения такого результата в Fubu?

Обновление: если это помогает, это первые несколько строк трассировки стека при первом попадании в конструктор Order:

at FubuDemo.Customer..ctor()
at FubuDemo.Controllers.Customers.CustomersController.Index(IndexInputModel inputModel)
at lambda_method(ExecutionScope , CustomersController , IndexInputModel )
at FubuMVC.Core.Behaviors.OneInOneOutActionInvoker`3.performInvoke()

И второй раз:

at FubuDemo.Customer..ctor()
at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at FubuMVC.Core.Models.StandardModelBinder.Bind(Type type, IBindingContext context)
at FubuMVC.Core.Runtime.ObjectResolver.BindModel(Type type, IBindingContext context)
at FubuMVC.Core.Runtime.ObjectResolver.BindModel(Type type, IRequestData data)
at FubuMVC.Core.Diagnostics.RecordingObjectResolver.BindModel(Type type, IRequestData data)
at FubuMVC.Core.Runtime.FubuRequest.<>c__DisplayClass2.<.ctor>b__0(Type type)
at FubuMVC.Core.Util.Cache`2.Retrieve(KEY key)
at FubuMVC.Core.Util.Cache`2.get_Item(KEY key)
at FubuMVC.Core.Runtime.FubuRequest.Get[T]()

1 ответ

Решение

Джон:

PartialForEach не обновляет новые модели, он передает модели, которые вы передаете (iexOrders).

Похоже, что проблема, с которой вы сталкиваетесь, заключается в том, что вы не добавили ".Using" в свой CustomerPartial.ascx

В CustomerPartial.ascx измените

<%= this.PartialForEach(x => x.Orders) %>

в

<%= this.PartialForEach(x => x.Orders).Using<OrderPartial>() %>

Другие вопросы по тегам