MVC3 ModelBinder для DynamicObject - PullRequest
0 голосов
/ 01 марта 2011

Я смотрю, есть ли пример проекта, учебник, ветка contrib или что-то в этом роде, подробно описывающая реализацию пользовательского ModelBinder для MVC3 для поддержки объектов, наследуемых от DynamicObject.

У меня есть объект доменаон имеет динамическое число свойств, определенных базой данных, и они могут изменяться во время выполнения.Чтобы упростить использование объекта, я сделал реализацию класса наследованной от DynamicObject и передаю модель представлению через ключевое слово [dynamic].

Все динамические свойства объекта находятся в свойстве коллекции объекта под названием «Атрибуты».Я хотел бы создать серию шаблонов редактора, чтобы конкретизировать модель, в идеале, поэтому все, что мне нужно сделать, это сделать вызов в соответствии с Html.EditorForModel (), и он будет динамически создавать пользовательский интерфейс.

Проблема в том, что мне не повезло найти реализацию ModelBinder, способную инспектировать DynamicObject и создавать интерфейс пользователя (я думаю, что это правильный термин для этого?).

Я нашел проект IDictionary ModelBinder, выполненный в одном из видеороликов MVCConf, снятом Роберто Эрнандесом (@hernandezrobert) на Расширяемость MVC3 (источник на http://mvcextensibility.codeplex.com/), но я этого не сделалМне очень повезло, что я приспособил его к моим целям. Мне было интересно, пытался ли кто-нибудь еще создать связующее для моделей, способное делать то, что я описываю? Или, может быть, он указал мне правильное направление?

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

ModelBinders не помогают генерировать представление, они помогают сопоставить необработанные параметры из различных веб-источников (форма, строка запроса и т. Д.) С входными параметрами, ожидаемыми вашим методом действия (в частности, если ваши входные параметры являются какой-то класс, а не примитивы).

То, что вы ищете, является примером того, как генерировать шаблоны представлений, которые я не видел для динамики. Лучший ресурс для генерации шаблонов обычного просмотра, который я видел, - это блог Брэда Уилсона . Если у вас есть средство (которое звучит так же, как и вы), чтобы выяснить, какие свойства должен отображать объект вместе с метаданными о том, как их отображать (например, textarea vs. input type = text и т. Д.), Тогда вы сможете просто следовать за Брэдом.

1 голос
/ 30 марта 2011

Мне удалось решить мою ситуацию, настроив обычный класс, который будет служить моделью для моего DanamicObject, и сохранив мои свойства следующим образом:

IList<DynamicProperty> DynamicProperties { get; set; }

Я создал собственное представление для DynamicObjectи в этом представлении я вызвал одного из помощников для отображения свойства DynamicProperties.Это позволяет MVC перебирать коллекцию и отображать каждое свойство.Далее у меня есть представление для DynamicProperty, которое я использую для отображения свойства по мере необходимости.Ключ также в том, что вы должны отобразить скрытое поле, содержащее первичный ключ этого конкретного атрибута.ModelBinder в MVC3 выполняет здесь гораздо лучшую работу, чем в MVc2, поэтому он будет отображать индекс массива как часть имени поля, так что первичный ключ и значение каждого свойства будут правильно сопоставлены при отправке.Вы, вероятно, захотите создать ViewModel специально для представленных данных, у меня были проблемы, когда я пытался использовать тот же класс модели, который использовался в представлениях деталей / редактирования, потому что я отображал только подмножество полей, поэтому они отсутствовали, когда я привязывался ктот же класс Model при обратной передаче.

Вы можете обработать сохранение, как обычно, но есть несколько соображений безопасности для этого типа объекта.Поскольку количество атрибутов является динамическим, нет способа гарантировать, что будет представлено то же количество полей, что и при исходной визуализации.Пользователь может добавить свое собственное или, что еще хуже, добавить поля для свойства, которое вы могли явно исключить.AntiForgeryToken предотвратил бы такого рода представления за пределами вашего домена, но с легкостью и популярностью манипулирования DOM, обеспечиваемого библиотеками, такими как jQuery, обратные передачи между сайтами - не единственная проблема, и я не знаю, будет ли AntiForgeryToken отвечать заэто, но я сомневаюсь в этом.

Этот подход оказался проще, чем пытаться наследовать от DynamicObject, реализовывать GetDynamicMemberNames и создавать собственный ModelBinder для использования обтекания.

Однако я создалпользовательские ModelMetaData и Validation Provider для обработки этих аспектов, поскольку свойства не являются строго типизированными, поэтому у MVC не было никаких аннотаций для использования.

...