Список объектов, не привязанных к модели, на обратной стороне в asp.net mvc 4

В моем приложении MVC 4 у меня есть Клиент, который может иметь несколько сайтов и может подписаться на несколько пакетов услуг. Краткая версия моей модели просмотра выглядит ниже

public class SubscriptionModel { public int MemberId { get; set; } public List SitePackges { get; set; } public SubscriptionModel() { SitePackges=new List(); } } public class SitePackage { public int SiteId { get; set; } public List LstPackageDisplayItems { get; set; } public SitePackage() { LstPackageDisplayItems=new List(); } } public class PackageDisplayItem { public int PackageId { get; set; } [Display(Name = "Package")] public string Name { get; set; } [DataType(DataType.Date)] [Display(Name = "Start Date")] public DateTime? StartDate { get; set; } } 

В моем controllerе я заполняю модель, а затем перехожу к View Model для рендеринга

  @using (@Html.BeginForm("CalculateCost", "HelpDesk", FormMethod.Post, new { @class = "form", id = "PackageSubscription", name = "PackageSubscription" })) { @Html.HiddenFor(x=>x.MemberId)  @foreach (var site in Model.SitePackges) {   @Html.Partial("_Packages",site.LstPackageDisplayItems) }

Мой частичный вид

 @model List @for (int i = 0; i  x[i].PackageId) 
}

Каждая вещь отлично SitePackges но в форме post модельное связующее не является обязательным списком SitePackges а его счет всегда равен 0. Мой controller имеет следующие подписи.

 [HttpPost] public ActionResult CalculateCost(SubscriptionModel subscriptionModel ) { var receivedModel = subscriptionModel; } 

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

JQuery Post

 function SubmitForm() { console.log($("#PackageSubscription").serialize()); $.ajax({ url: '/HelpDesk/CalculateCost', cache: false, dataType: 'json', data: $("#PackageSubscription").serialize(), type: 'POST', success: function (data) { } }); 

}

Буду признателен за любую помощь. Спасибо

Текущая реализация – это рендеринг входов, которые выглядят так:

   

но для привязки к вам модели они должны выглядеть так:

     

A : Вы должны либо визуализировать элементы управления в вложенных циклах

 for(int i = 0; i < Model.SitePackges.Count; i++) { @Html.HiddenFor(m => m.SitePackges[i].SiteId) for(int j = 0; j < Model.SitePackges[i].LstPackageDisplayItems.Count; j++) { @Html.TextBoxFor(m => m.SitePackges[i].LstPackageDisplayItems[j].Name) } } 

B : используйте пользовательские EditorTemplates для типов моделей

Views / Shared / EditorTemplates / SitePackage.cshtml

 @model SitePackage @Html.HiddenFor(m => m.SiteId) @Html.EditorFor(m => m.LstPackageDisplayItems) 

Views / Shared / EditorTemplates / PackageDisplayItem.cshtml

 @model PackageDisplayItem @Html.TextBoxFor(m => m.Name) 

и в главном виде

 @model SubscriptionModel @using (@Html.BeginForm()) { @Html.HiddenFor(m => m.MemberId) @Html.EditorFor(m => m.SitePackges)  } 

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

 int pos = Model.Products.Count - 1; for (int j = 0, a = Model.Products.Count; j < a; j++) { // I exclude the last one because the users is adding it // and will be displayed in another section. else causes problems if (j != pos) { 
@Html.HiddenFor(m => m.Products[j].Id) @Html.DisplayTextFor(m => m.Products[j].Description) @Html.HiddenFor(m => m.Products[j].Description) @Html.DisplayTextFor(m => m.Products[j].Style) @Html.HiddenFor(m => m.Products[j].Style)
} }

это не работает ниже

 for (int j = 0, a = Model.Products.Count; j < a; j++) { if (j != pos) { 
@Html.HiddenFor(m => m.Products[j].Id) @Html.HiddenFor(m => m.Products[j].Description) @Html.HiddenFor(m => m.Products[j].Style)
} }

или это

 for (int j = 0, a = Model.Products.Count; j < a; j++) { if (j != pos) { 
@Html.HiddenFor(m => m.Products[j].Id) @Html.DisplayTextFor(m => m.Products[j].Description) @Html.HiddenFor(m => m.Products[j].Description) @Html.DisplayTextFor(m => m.Products[j].Style) @Html.HiddenFor(m => m.Products[j].Style)
} }

@site.SiteId
Name Start Date
@Html.DisplayFor(x => x[i].Name) @Html.TextBoxFor(x => x[i].StartDate, "{0:d MMM yyyy}", new { @class = "jquery_datepicker form-control", autocomplete = "off" })