Россия |
Привязка данных ADO.NET
Использование ObjectDataSource с параметризованным конструктором пользовательского класса
Компонент ObjectDataSource сам создает экземпляр пользовательского класса и мы не имеем возможности декларативно передать в него информацию через параметры конструктора. Но можно воспользоваться событиями компонента ObjectDataSource, чтобы обойти это ограничение.
Компонент ObjectDataSource имеет богатую модель событий, представленную ниже
- System.Web.UI.WebControls.ObjectDataSource.Deleted
- System.Web.UI.WebControls.ObjectDataSource.Deleting
- System.Web.UI.WebControls.ObjectDataSource.Filtering
- System.Web.UI.WebControls.ObjectDataSource.Inserted
- System.Web.UI.WebControls.ObjectDataSource.Inserting
- System.Web.UI.WebControls.ObjectDataSource.ObjectCreated
- System.Web.UI.WebControls.ObjectDataSource.ObjectCreating
- System.Web.UI.WebControls.ObjectDataSource.ObjectDisposing
- System.Web.UI.WebControls.ObjectDataSource.Selected
- System.Web.UI.WebControls.ObjectDataSource.Selecting
- System.Web.UI.WebControls.ObjectDataSource.Updated
- System.Web.UI.WebControls.ObjectDataSource.Updating
Эти события можно разделить на две категории:
- Заканчивающиеся на ing - происходят во время выполнения задачи и позволяют вмешаться в этот процесс, что-то настроить или прервать
- Заканчивающиеся на ed - происходят по завершении задачи и удобны для протоколирования действий, синхронизации других элементов управления или обработки ошибок
Если мы хотим передать компоненту ObjectDataSource уже инициализированный параметризованным конструктором готовый экземпляр пользовательского класса, то этот экземпляр нужно самим создать с вызовом нужного конструктора. И сделать это нужно в обработчике события ObjectDataSource.ObjectCreating.
Продолжим эксплуатировать наш класс EmployeeDB, в котором как раз есть параметризованный конструктор наряду с конструктором по умолчанию. Он принимает произвольную строку соединения и имеет вид
using System; using System.Web.Configuration; public partial class EmployeeDB { private string connectionString; public EmployeeDB() { // Извлечь из файла web.config строку соединения по умолчанию connectionString = WebConfigurationManager. ConnectionStrings["Northwind"].ConnectionString; } public EmployeeDB(string connectionStringCustom) { // Извлечь из файла web.config другую строку соединения connectionString = WebConfigurationManager. ConnectionStrings[connectionStringCustom].ConnectionString; } }
-
Скопируйте страницу ObjectDataSourceSimple.aspx под именем ObjectDataSourceDesigner.aspx и назначьте ее стартовой
-
Запустите страницу, чтобы проверить, что конструктор по умолчанию работает и извлекает из файла Web.Config строку соединения с именем "Northwind"
-
В файле Web.Config скопируйте строку соединения с идентификатором "Northwind" под другим именем "CloneNorthwind", после чего должно получиться следующее
<?xml version="1.0"?> <configuration> <connectionStrings> <add name="Northwind" connectionString="Data Source=localhost; Initial Catalog=Northwind; user id=sa; password=;" /> <add name="CloneNorthwind" connectionString="Data Source=localhost; Initial Catalog=Northwind; user id=sa; password=;" /> </connectionStrings> <system.web> <compilation debug="true"/> </system.web> </configuration>
-
Измените в файле Web.Config имя строки соединения "Northwind" на несуществующее имя, например "Northwind1" и вновь запустите страницу. Теперь страница выдает ошибку, поскольку конструктор по умолчанию ищет в файле Web.Config строку соединения с именем "Northwind"
Пусть теперь это ошибочное имя строки соединений пока побудет в файле Web.Config, а мы попробуем запустить конструктор по умолчанию, чтобы страница искала строку соединения с именем "CloneNorthwind", которая у нас есть.
-
Откройте страницу на редактирование в режиме Design и выделите на ней объект ObjectDataSource1
-
Переведите панель Properties в режим редактирования событий и двойным щелчком на поле ObjectCreating создайте обработчик этого события
-
Заполните обработчик так, чтобы окончательный код страницы ObjectDataSourceDesigner.aspx был следующим
<%@ Page Language="C#" %> <script runat="server"> protected void ObjectDataSource1_ObjectCreating(object sender, ObjectDataSourceEventArgs e) { e.ObjectInstance = new EmployeeDB("CloneNorthwind"); } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetAllEmployees" TypeName="EmployeeDB" OnObjectCreating="ObjectDataSource1_ObjectCreating" /> <asp:ListBox ID="ListBox1" runat="server" DataSourceID="ObjectDataSource1" DataTextField="LastName" /> <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" /> </div> </form> </body> </html>
-
Запустите страницу ObjectDataSourceDesigner.aspx и убедитесь, что опять все заработало, поскольку новую строку соединения пользовательский объект теперь получает через параметризованный конструктор в обработчике
-
Верните в файле Web.Config прежнее имя "Northwind" строке соединения, поскольку его используют все наши предыдущие страницы (строку с именем "CloneNorthwind" также оставьте для работы этого примера)