Создание привязанных к данным полей FormView на лету - PullRequest
0 голосов
/ 15 июля 2011

У меня есть приложение ASP.NET 3.5 с веб-формой, содержащей элемент управления FormView, используемый для выполнения операций CRUD над объектом домена. Новое требование добавляет некоторый динамический контент к объекту домена, который должен быть отражен в FormView. Это означает, что мне нужно генерировать эти элементы управления на лету на основе связанного объекта.

Я использую ObjectDataSource для FormView, который возвращает объект домена для привязки. Доменный объект теперь будет иметь свойство, которое возвращает коллекцию объектов Разделов, каждый из которых содержит список Вопросов. В середине моей формы мне нужно отобразить каждый раздел со списком вопросов и текстовым полем, которое позволяет пользователю ввести ответ.

Я могу сгенерировать пользовательский интерфейс несколькими различными способами, но мне еще предстоит найти способ, который включал бы данные для динамических полей при повторной публикации страницы. Поскольку я не буду знать «схему» до тех пор, пока FormView не будет привязан к данным, мне интересно, не слишком ли поздно в конвейере для правильной обработки данных обратной передачи.

Как мне лучше всего сгенерировать эти поля, чтобы данные отправлялись обратно правильно?

UPDATE

Я все еще ищу лучший способ выполнить эту задачу, но я нашел решение, которое по крайней мере работает. Короче говоря, я создаю динамическое содержимое в обработчике событий DataBound в FormView, потому что это первое место в конвейере, где я всегда могу получить ссылки на элементы управления FormView. Затем я следую предложению Мухаммеда и извлекаю значения прямо из коллекции Request.Form и помещаю их в объекты EventArgs в обработчиках ItemInserting и ItemUpdating FormView.

Это не так просто, так как каждый элемент управления должен иметь уникальный идентификатор, который я затем могу использовать, чтобы найти значение - что не так уж и плохо. Однако мне пришлось реализовать пользовательскую логику в источнике данных, чтобы затем сопоставить эти значения с привязанным к данным объектом.

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

1 Ответ

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

Если вы хотите получить значение из динамически генерируемого поля, вы должны получить его из коллекции Request.Form и передать его в событие ItemInserting FormView.например,

 protected void frmAsset_ItemInserting(object sender, FormViewInsertEventArgs e)
 {
   e.Values["FieldName"] =    Request.Form[ControlClientID];
 }

Обратите внимание, ваши элементы управления должны быть воссозданы при обратной передаче, чтобы получить значение.

...