TL; 0: Мне просто нужно выяснить, почему я не могу сериализовать() родительский div частичного представления и получить модель. Кодирование этого вручную будет происходить навсегда, так как есть много родительских партикулов, с которыми мне пришлось бы использовать ту же логику.Комплексный вложенный частичный вид Ajax Сообщение для MVC 5 Контроллер
Дополнительная информация: Я пробовал 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; }
...
Чтобы выбрать & пост входов от всего этого частичного вида, я реализовал переменный класс, а также его относительный шаблон префикс держать 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>
Частичный, который я пытаюсь опубликовать. (Сильно типизированных частичное для 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 to PhoneModel в вышеуказанном коде) ...
Вы должны использовать 'EditorTemplates' не частичные, чтобы обеспечить правильное имя элемента управления формы. Ваше представление похоже на «ContactModel», но вы отправляете обратно «ContactPhoneModel», поэтому имена ваших данных формы не соответствуют именам ваших свойств модели, поэтому их нельзя привязать –
У вас также есть свойство 'public PhoneModel PhoneModel', но Я предполагаю, что это должно быть 'public ContactPhoneModel PhoneModel'? –
@StephenMuecke Как я уже говорил выше, 'EditorTemplates' не будет работать для списка типов переменных, который я реализую с этим представлением. Также я знаю различия в названиях моделей, которые я пытался их сокращать, и редактируйте сообщение, чтобы исправить их. – Pakk