2015-10-09 2 views
1

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 в вышеуказанном коде) ...

enter image description here

+0

Вы должны использовать 'EditorTemplates' не частичные, чтобы обеспечить правильное имя элемента управления формы. Ваше представление похоже на «ContactModel», но вы отправляете обратно «ContactPhoneModel», поэтому имена ваших данных формы не соответствуют именам ваших свойств модели, поэтому их нельзя привязать –

+0

У вас также есть свойство 'public PhoneModel PhoneModel', но Я предполагаю, что это должно быть 'public ContactPhoneModel PhoneModel'? –

+0

@StephenMuecke Как я уже говорил выше, 'EditorTemplates' не будет работать для списка типов переменных, который я реализую с этим представлением. Также я знаю различия в названиях моделей, которые я пытался их сокращать, и редактируйте сообщение, чтобы исправить их. – Pakk

ответ

1

Это скорее псевдо-код, чем действительный код, вам нужно немного его убрать.

Поскольку вы не отправляете назад полную страницу, кажется, что она переполнена, чтобы перепрыгнуть через обручи модели 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); 
    } 

Я хотел бы посмотреть на использование editortemplates как упомянуто в комментариях, они будут принимать некоторые боли прочь от управления индексами и например,

+0

Это действительно здорово, и я протестировал это, и «измененный» работает настолько, насколько это касается всего лишь частичного, однако привязка какой-либо частичной «родительской» модели будет все сложнее управлять кодом для захвата данных, используя это методология. Я ценю время, которое вы приняли за ответ и код. – Pakk

0

Вот несколько (unrefined, and early) code, которые я написал, которые будут обрабатывать правильно отформатированные данные serializeArray() и повторно создавать массивы для хорошей записи в контроллер MVC.

В верхнем 2-х строках будет показано, как вызвать его один раз в вашем проекте.

Смежные вопросы