Правильное использование ObjectDataSource
-
08-07-2019 - |
Вопрос
Приветствую!
Я создаю пользовательский элемент управления, который будет отображать данные в элементе управления GridView.Мы используем n-уровневую архитектуру, и данные, о которых идет речь, извлекаются из нашей базы данных и возвращаются нам в виде ReadOnlyCollection.OurNewObject - это класс , содержащий несколько свойств и пустой конструктор , который не принимает параметров - он находится в следующем пространстве имен:Acme.Объектная модель.
В пользовательском элементе управления у меня есть следующее:
<asp:GridView ID="ourGrid" runat="server" DataSourceID="ourDataSource">
<columns>
<asp:BoundField DataField="Name" HeaderText="Full Name" />
<asp:BoundField DataField="Gender" HeaderText="Gender" />
<asp:BoundField DataField="BirthYear" HeaderText="Year of Birth" />
<asp:BoundField DataField="JoinDate" HeaderText="Date Joined" />
</columns>
</asp:GridView>
<asp:ObjectDataSource ID="ourDataSource" runat="server" SelectMethod="GetTopUsers" TypeName="Acme.Model.OurNewObject">
</asp:ObjectDataSource>
В коде пользовательского элемента управления у меня есть следующий открытый метод:
public ReadOnlyCollection<OurNewObject> GetTopUsers()
{
return (OurDataProxy.GetJustTheTopUsers());
}
Когда я помещаю пользовательский элемент управления в веб-форму и запускаю его, я получаю следующее сообщение:
ObjectDataSource 'ourDataSource' не удалось найти универсальный метод 'GetTopUsers', у которого нет параметров.
Итак, мои вопросы таковы:
- Использую ли я ObjectDataSource неправильно?
- Есть ли более правильный способ использовать ObjectDataSource в этой ситуации?
Спасибо.
Решение
Я полагаю, что проблема заключается в отсутствии двух атрибутов.
Сначала в вашем методе GetTopUsers() добавьте этот атрибут
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, true)]
Затем в фактическом классе OurNewObject добавьте этот атрибут
[System.ComponentModel.DataObject]
Другие советы
Обычно вы создаете отдельный объект, содержащий ваши методы доступа к данным, вместо того, чтобы помещать эти методы в исходный код.Отдельный объект может быть экземпляром или статическим, но сам объект должен иметь конструктор без параметров (или вообще не иметь конструктора).
Кроме того, свойство TypeName в ObjectDataSource должно ссылаться на typename вышеупомянутого отдельного объекта.Пример:
public class SampleDataObject
{
public ICollection<OurNewObject> GetTopUsers()
{
//[...]
}
}
Атрибуты, упомянутые выше:[System.ComponentModel.DataObject(true)] на уровне класса и [System.ComponentModel.DataObjectMethod(Тип dataobjectmethod.Select)] в методе getter не требуются, но помогут в поддержке во время разработки, отфильтровывая другие типы при поиске классов, к которым можно подключить ваш ObjectDataSource.
Попробуйте добавить DataKeyNames
(добавьте атрибут primary key) к GridView
и посмотреть, сработает ли это?