复杂嵌套局部视图 Ajax Post 到 MVC 5 控制器

Complex Nested Partial View Ajax Post to MVC 5 Controller

TL;DR: 我只需要弄清楚为什么我不能序列化()部分视图的父 div 并接收模型。手动编码将永远花费很长时间,因为有许多父部分我必须使用相同的逻辑。

更多信息:我已经尝试使用 EditorTemplate 进行绑定,但不幸的是,据我搜索,没有简单的方法可以将它们用作变量列表。

开始:

型号

public class ContactModel 
{                
    public List<ContactDetailModel> Contacts { get; set; }
    ....


public class ContactDetailModel
{
    public ContactView Contact { get; set; }
    public PhoneModel PhoneModel { get; set; }
    ...

public class PhoneModel
{
    public int ContactId { get; set; }
    public int IsPrimaryPhoneNumberId { get; set; }
    public List<PhoneView> Phones { get; set; }
    public List<EmailPhoneTypeView> EmailPhoneTypes { get; set; }
...

对于来自这个局部视图的 select & post 输入,我实现了一个变量 class,它的相关模板前缀保持局部视图的 MVC 绑定.

@{
 var phoneClass = "phone" + @Model.Contacts[index].Contact.ContactId;
 var phoneTemplatePrefix = "Contacts[" + index + "].PhoneModel";
 }

这是 运行 循环内部,根据需要增加索引以保持绑定。

<div class="@phoneClass">
     @Html.Partial("_ContactPhone", Model.Contacts[index].PhoneModel, new ViewDataDictionary() { TemplateInfo = new TemplateInfo() { HtmlFieldPrefix = phoneTemplatePrefix } })
</div>

我正在尝试的部分 post。 (PhoneModel 的强类型部分)

@{var addNavigationClass = "AddContactPhone" + Model.ContactId;}

for (var phoneIndex = 0; phoneIndex < Model.Phones.Count(); phoneIndex++)
{
    @Html.HiddenFor(model => model.Phones[phoneIndex].ContactPhoneId)
    @Html.DropDownListFor...
    @Html.TextBoxFor(model => model.Phones[phoneIndex].PhoneNumber)
    <a href="#" class="removeMemberPhone">Trash</a>
    @Html.RadioButtonFor(model => model.IsPrimaryPhoneNumberId, Model.Phones[phoneIndex].ContactPhoneId) Primary</label>
}

视图的点击功能内部

var model = $('.phone' + '@Model.ContactId' + ' :input').serialize();
console.log('model', model);

$.ajax({
   url: '/Contact/AddPhone',
   type: 'POST',
   data: model,
   success: function (data) {
     console.log(data.length);
    }
    ....

日志的输出

model Contacts%5B1%5D.PhoneModel.Phones%5B0%5D.ContactPhoneId=3907&Contacts%5B1%5D.PhoneModel.Phones%5B0%5D.EmailPhoneTypeId=1&..........

我的模型在我的控制器中从来没有任何值(我在上面的代码中将 ContactPhoneModel 缩写为 PhoneModel)...

这是比实际代码更多的伪代码,您需要稍微整理一下。

由于您没有回发整个页面,因此在绑定到集合时跳过 Mvc 模型活页夹箍似乎有点过分了。如果是我这样做,我会将您的点击处理程序更改为以下内容:

var model = {};
$('.phone' + '@Model.ContactId' + ' :input').each(function(){
    model[/[^\.]+$/.exec($(this).prop("name"))[0]] = $(this).val();
};
console.log('model', model);

$.ajax({
   url: '/Contact/AddPhone',
   type: 'POST',
   data: model,
   contentType: "application/json; charset=UTF-8",
   success: function (data) {
      console.log(data.length);
    }

我会考虑使用评论中提到的编辑器模板,它们会减轻管理索引等的痛苦

这是我写的一些 (unrefined, and early) code,它将采用正确格式的 serializeArray() 数据并将数组重新设置为良好的 post 到 MVC 控制器。

前 2 行将显示如何在您的项目中调用一次。