Я начал использовать элемент управления FormView, чтобы включить двустороннюю привязку данных в веб-формах asp.net. Мне понравилось, что это избавило меня от необходимости писать процедуры loadForm и unloadForm на каждой странице. Так что с самого начала все работало хорошо, когда я просто использовал текстовые поля везде ... но когда пришло время начинать преобразовывать некоторые из них в DropDownLists, все терялось. Например, см .:
Невозможно загрузить DropDownList в FormView из кода позади?
.... и у меня было много дополнительных проблем после этого.
Итак, я наткнулся на статью об AutoMapper, о которой я пока что знаю очень мало, но, судя по звукам, эта может стать жизнеспособной альтернативой двусторонней привязке данных формы к объекту домена. объект? Насколько я понимаю, AutoMapper в основном работает по соглашению об именах, поэтому он будет искать свойства совпадающих имен (?) В объектах источника и назначения.
Итак, в основном, у меня есть все мои доменные сущности (то есть: Person) со свойствами (FirstName, LastName, Address и т. Д.) .... что я хотел бы сделать, это объявить свои элементы управления asp (текстовые поля, выпадающие списки и т. д.) с теми же именами, и их автоматический загрузчик и выгрузка.
Так что, если бы это сработало, человек мог бы просто полностью избавиться от проклятого элемента управления FormView, и это была бы всего одна строка для привязки и отмены привязки веб-формы.
(Да, конечно, если бы я использовал MVC, у меня не было бы этих проблем, я знаю).
Предупреждение 1 : AutoMapper должен знать правильное имя свойства для каждого элемента управления тип (сам элемент управления будет иметь тот же идентификатор, что и свойство в объект, но поведение будет зависеть от типа элемента управления), то есть:
Person.FirstName -> form.FirstName. .Text
Person.Country -> form.Country. Выбранное значение
Person.IsVerified -> form.IsVerified. Проверено
.... так что ему нужно иметь смарты, чтобы найти элемент управления в форме, определить его тип, а затем загрузить / выгрузить между объектом домена и элементом управления веб-формы в надлежащее свойство элемента управления.
Предупреждение 2 : вложенные элементы управления - чтобы еще больше усложнить ситуацию, если один может передать веб-форму в AutoMapper (пока не знаю, можете ли вы), источник / назначение элементы управления не обязательно находятся в корне веб-формы, поэтому нужно было бы иметь возможность выполнять рекурсивный поиск всех дочерних элементов управления в переданной веб-форме (это легко), возвращая коллекцию всех допустимых экземпляров типов элементов пользовательского интерфейса.
Предостережение 3 : элементы пользовательского интерфейса элемента управления не являются общедоступными - при обходе иерархии вложенных элементов управления в # 2, если вы используете элементы управления пользователя, которые не предоставляют свои содержащиеся в них элементы публично (без жесткого кодирования, так ), нужно было бы выполнить FindControl для каждого элемента в текущей коллекции AutoMapper. Этот кажется потенциальным нарушителем ...
a) производительность может быть очень плохой (хотя, если пользовательский элемент управления найден, его можно передать в конец очереди и обработать только при необходимости)
б) как внутри отдельной функции карты можно получить ссылку на всех братьев и сестер текущего сопоставленного элемента в текущей функции сопоставления?
Есть идеи ??
Обновление
Из того, что я прочитал, похоже, что путь, по которому, вероятно, придется идти:
http://automapper.codeplex.com/wikipage?title=Custom%20Type%20Converters&referringTitle=Home
http://msdn.microsoft.com/en-us/library/ayybcxe5%28VS.71%29.aspx