在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; } }
在我的控制器中,我填写模型,然后传递给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) { @site.SiteId Name Start Date @Html.Partial("_Packages",site.LstPackageDisplayItems) }
我的部分观点是这样的
@model List @for (int i = 0; i x[i].PackageId) @Html.DisplayFor(x => x[i].Name) @Html.TextBoxFor(x => x[i].StartDate, "{0:d MMM yyyy}", new { @class = "jquery_datepicker form-control", autocomplete = "off" }) }
每件事都很好,但在表单上,模型绑定器不绑定SitePackges
列表,其计数始终为0.我的控制器具有以下签名。
[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) { } });
}
我将不胜感激任何帮助。 谢谢
您当前的实现是渲染输入,如下所示:
但为了绑定到你的模型,他们需要看起来像这样:
答 :您需要在嵌套for
循环中呈现控件
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
查看/共享/ EditorTemplates / SitePackage.cshtml
@model SitePackage @Html.HiddenFor(m => m.SiteId) @Html.EditorFor(m => m.LstPackageDisplayItems)
查看/共享/ 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) }
我发现您需要在包含父面板中的项目ID。
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) } }