Я использую подход Стива Сандерсона 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<PaymentMethod> 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<Transfer> 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" })
...
<div id="editorPaymentRows">
@foreach (var payment in Model.payment_methods)
{
@Html.Partial("_NewPayment", payment)
}
</div>
}
В частичном _NewPayment:
@using prj.Helpers
@model prj.Models.Model.PaymentMethod
<div class="editPaymentRow">
@using (Html.BeginCollectionItem("payment_methods"))
{
...
<div class="editor-label">
@Html.LabelFor(m => m.tt.total_value)<req>*</req>
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.tt.total_value)
</div>
...
<div id="editorTransferRows">
@if (Model.tt != null)
{
foreach (var transfer in Model.tt.transfers)
{
@Html.Partial("_NewTransfer", transfer)
}
}
...
</div>
}
</div>
и, наконец, в частичном _NewTransfer:
@using prj.Helpers
@model prj.Models.Model.Transfer
...
<div class="editTransferRow">
//using (Html.BeginCollectionItem("transfers"))
@using (Html.BeginCollectionItem("tt.transfers"))
{
...
<div class="editor-label">
@Html.LabelFor(m => m.swift)<req>*</req>
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.swift, new { @class = "t_swift" })
</div>
...
<div class="editor-label">
@Html.LabelFor(m => m.transfer_amount)<req>*</req>
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.transfer_amount, new { @class = "t_transfer_amount" })
</div>
...
}
</div>
Так что все работает, за исключением того, что в контроллере список передач, который находится вСвойство TT для PaymentMethods всегда равно нулю.Он не передается контроллеру должным образом.Есть что-то, чего мне не хватает?
Не работает ли вложенный элемент BeginCollectionItem?Есть ли дополнительный шаг, который я должен сделать?Пожалуйста, пролите немного света.Спасибо
Я понял это, используя метод Джо Стивенса, показанный по следующей ссылке:
http://www.joe -stevens.com / 2011/06/06 / edit-and-binding-nested-lists-with-asp-net-mvc-2 /
Приветствия