MVC3 ModelBinding к коллекции, опубликованной с пробелами в индексе - PullRequest
5 голосов
/ 28 июля 2011

У меня есть коллекция объектов в моей модели, которую я рендерил в виде с помощью функции EditFor, и у меня есть EditorTemplate, который отвечает за фактическое отображение каждого объекта.

@Html.EditorFor(model => model.MyObjects)

Это имеетНекоторое время работал хорошо, и когда вы проверяете html, мои текстовые поля начинаются с префикса со свойством модели, за которым следует индекс коллекции, из которой они получены.

<input class="text-box single-line" id="MyObjects_2__SomeProperty" 
name="MyObjects[2].SomeProperty" type="Text" value="" />

Однако я недавно началиспользуя свойства ShowForEdit и ShowForDisplay в метаданных модели для коллекции и в первой строке моего шаблона редактора, если ShowForEdit не соответствует действительности, я просто пропускаю его.

@if (!ViewData.ModelMetadata.ShowForEdit)
{
    return;
}

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

В данном случае это фактически мой первый элемент в коллекции, который я пропускаю, поскольку не хочу егобыть видимым в представлении редактирования, но из-за этого, когда я отправляю обратно, первый индекс в html равен 1 (вместо 0, как это обычно бывает), но это проблема, когда вы пытаетесь сохранить изменения.Это также проблема при изменении DOM с использованием javascript.

Кто-нибудь еще сталкивался с проблемой способности связывателя модели по умолчанию читать данные, отправленные обратно, когда один или несколько индексов в представленной коллекции html отсутствуют?

Существуют ли модельные связующие, которые решают эту проблему?

1 Ответ

0 голосов
/ 28 июля 2011

Есть несколько очень хороших постов в блоге, которые позволяют вам привязать модель к списку без необходимости предоставлять непрерывный индекс на основе нуля. Пожалуйста, посмотрите на http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/
http://zahidadeel.blogspot.com/2011/05/master-detail-form-in-aspnet-mvc-3-ii.html
Кроме того, если вы заинтересованы в паттерне MVVM и нокауте, вы можете проверить эту замечательную работу Стив Сандерсон
Для получения дополнительной информации вставьте «Редактирование списка длин вариабельной таблицы в стиле mvc» в Google, и он даст вам дюжину полезных ссылок

...