Вы не показывали свою фазу привязки данных «Загрузка» (код, который связывает данные из списка до элементов управления) - поэтому я предполагаю, что часть вас не устраиваетwith - это фаза «Сохранить» (код в Page_PreLoad
, который связывает измененные значения с элементами управления обратно к списку), т.е. # 4 в вашем списке:
имеет изменения в пользовательском интерфейсе, привязанном к списку объектов
Звучит так, как будто вы хотите «двустороннее связывание данных»: вы хотите .NET для update ваша модель так же легко, как она читает из вашей модели.Это распространенная жалоба .Одним из решений является подкласс WebControl , но это беспорядок.
Вы уже используете синтаксис <%# Bind("...") %>
, поэтому у вас есть правильная идея.Этот подход должен работать «из коробки» с <asp:SqlDataSource>
, , но вы хотите обновить пользовательский класс, , поэтому вам нужно использовать <asp:ObjectDataSource>
.Используйте подход из этой статьи , за исключением использования ObjectDataSource вместо SqlDataSource.
Но сначала вы должны сделать свою модель (т.е. Class1
) совместимой с ObjectDataSource, пометив ее [System.ComponentModel.DataObject] и назначение соответствующего метода обновления следующим образом:
[System.ComponentModel.DataObjectMethodAttribute(
System.ComponentModel.DataObjectMethodType.Update, true)]
public bool UpdateProduct(string productName, ...) {
...
}
Это позволит вам использовать ObjectDataSource в вашей веб-форме и, наконец, получить хорошийДвусторонняя привязка данных.Для получения более подробной информации обратитесь к ссылкам.
Visual Studio предлагает различные неуклюжие способы автоматизации, такие как TableAdapters и печально известный строго типизированный набор данных (STD) ,но те не помогают таким людям, как вы, у которых есть своя объектная модель.В любом случае, я не рекомендую ЗППП.
Я думал, что есть лучший способ?
Не думаю, что ваш нынешний подход плох.Если вы беспокоитесь о наличии тонны логики в ваших веб-формах, вы бы получили гораздо больше пользы от подхода MVC , чем от связывания сахара ...