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

Я начинаю работать с 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 повторно создает его потерять содержимое коллекции Orders.

Это не совсем то, что я ожидал, я бы подумал, что 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 Ответ

2 голосов
/ 15 марта 2010

Джон:

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

Похоже, проблема в том, что вы не добавили «.Using» в свой CustomerPartial.ascx

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

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

до

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

...