2009-08-13 4 views
3

У меня есть клиент dto, который содержит кучу полей, а также содержит список.Сложная привязка к модели

Теперь я могу привязываться к нему довольно просто, и он отобразит Клиента со всеми его адресами. Дело в том, что пользователь может удалять и добавлять адреса динамически.

Я думал о добавлении форм, связанных с каждым адресом, но затем я заканчиваю внутренними формами, и я знаю, что браузеры не так хорошо играют.

Тогда я подумал об использовании javascript, но если адрес удален, мне нужно пройти все адреса и изменить их индексы (адреса [0] .City), потому что я заметил, что если индексы не в порядке, а action принимает ClientForm в качестве параметра, то только в списке, которые имеют последовательные индексы, и они начинаются с 0 -, попадают в список ClientForm.Addresses.

Любые другие решения, которые легко реализовать? Я что-то упускаю ?

ответ

1

Если вы поместите кнопку отправки с другим именем на каждом из адресов, но не теги формы, ваша внешняя форма может проверить наличие конкретной кнопки и перенаправить на правильное действие (например, изменить адрес № 1, удалить адрес 3 и т. д.)

Если вы используете проверку jquery, одно из предостережений состоит в том, что тип всех кнопок отправки «ребенок» должен быть установлен на «отменить», поэтому при нажатии их проверка не происходит.

НТН,

Dan

+0

не уверен, я понимаю, что вы имеете в виду: «ваш внешний вид может проверить для существования ....» короткий пример будет большой. – sirrocco

1

Для каждого адреса на странице обеспечивают скрытое поле формы под названием addresses.Index, это будет иметь целочисленное значение. Модификатор модели ASP.NET MVC (в версии 2 и выше) получит несколько значений поля формы addresses.Index и использует целочисленные значения, чтобы определить, какие значения полей addresses[index].property логически принадлежат друг другу.

E.g.

addresses.Index = 0 
addresses.Index = 3 

побудит модель связующий идти за ...

addresses[0].City 
addresses[0].Street 
addresses[3].City 
addresses[3].Street 

... и заполнить в своем действии контроллера в ICollection<Address> с двумя элементами.

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

Это решение описано более подробно Phil Haack here.

+0

Индекс даже не должен быть целым числом, не так ли? Я просто использовал уникальное значение, такое как Id, которое оказалось целым числом. Таким образом, мне не нужно было назначать индекс на клиенте, чтобы убедиться, что они остались уникальными. – Benjamin

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