Вложенный BeginCollectionItem

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

Мои модели следующие:

public class Order
{

        [Key]
        [HiddenInput]
        public int id { get; set; }

        [Display(Name = "Order number")]
        public string number { get; set; }

        ...

        [Display(Name = "Payment method")]
        public List payment_methods { get; set; }

        ...
}

public class PaymentMethod
{
        public MethodOfPayment method { get; set; }
        public CC cc { get; set; }
        public CASH cash { get; set; }
        public TT tt { get; set; }
}

public class TT
{
        [Key]
        public int id { get; set; }

        [Required(ErrorMessage = "{0} is required.")]
        [Display(Name = "Total amount")]
        public double? total_value { get; set; }

        ...

        [Display(Name = "Transfers")]
        public List transfers { get; set; }
}

public class Transfer
{
        [Key]
        public int id { get; set; }

        [Display(Name = "Payment")]
        public int payment_id { get; set; }

        [Required(ErrorMessage = "{0} is required.")]
        [Display(Name = "SWIFT")]
        public string swift { get; set; }

        [Required(ErrorMessage = "{0} is required.")]
        [Display(Name = "Amount transferred")]
        public double? transfer_amount { get; set; }

        [Required(ErrorMessage = "{0} is required.")]
        [Display(Name = "Date transferred")]
        public DateTime transfer_date { get; set; }

        ...
}

Теперь у меня есть Заказ, который может иметь несколько способов оплаты, и если одним из способов оплаты является TT (телексный перевод), он может включать несколько переводов. Реализация нескольких способов оплаты в одном Заказе в виде коллекции работает, но когда я пытаюсь реализовать несколько переводов внутри ТТ, ни один из этих переводов не передается контролеру.

Вот как выглядит мое представление:

@model prj.Models.Model.Order

@using (Html.BeginForm("Create")){
@Html.ValidationSummary(true, "Creation was unsuccessful. Please correct the errors and try again.")

...

@Html.TextBoxFor(m => m.number, new { id = "txtnumber" })

...


@foreach (var payment in Model.payment_methods) { @Html.Partial("_NewPayment", payment) }
}

В партиале _NewPayment:

@using prj.Helpers 
@model prj.Models.Model.PaymentMethod

@using (Html.BeginCollectionItem("payment_methods")) { ...
@Html.LabelFor(m => m.tt.total_value)*
@Html.TextBoxFor(m => m.tt.total_value)
...
@if (Model.tt != null) { foreach (var transfer in Model.tt.transfers) { @Html.Partial("_NewTransfer", transfer) } } ...
}

и, наконец, в партиале _NewTransfer:

@using prj.Helpers 
@model prj.Models.Model.Transfer
...

//using (Html.BeginCollectionItem("transfers")) @using (Html.BeginCollectionItem("tt.transfers")) { ...
@Html.LabelFor(m => m.swift)*
@Html.TextBoxFor(m => m.swift, new { @class = "t_swift" })
...
@Html.LabelFor(m => m.transfer_amount)*
@Html.TextBoxFor(m => m.transfer_amount, new { @class = "t_transfer_amount" })
... }

Итак, все работает, за исключением контроллера, который перечисляет List, который находится в свойстве TT метода PaymentMethods. всегда равно нулю. Он не передается контроллеру должным образом. Есть что-то, что я упускаю?

Вложенный элемент BeginCollectionItem не работает? есть ли дополнительный шаг, который я должен сделать? Пожалуйста, пролейте немного света. Спасибо


Я понял это, используя метод Джо Стивенса, показанный по следующей ссылке:

http://www.joe-stevens.com/2011/06/06/editing-and-binding-nested-lists-with-asp-net-mvc-2/

Cheers

11
задан casperOne 9 March 2012 в 19:02
поделиться