Правильное использование ObjectDataSource - PullRequest
1 голос
/ 20 ноября 2008

Привет!

Я создаю пользовательский элемент управления, который будет отображать данные в элементе управления GridView. Мы используем n-уровневую архитектуру, и соответствующие данные извлекаются из нашей базы данных и возвращаются нам в виде ReadOnlyCollection. OurNewObject - это класс, содержащий несколько свойств и пустой конструктор, который не принимает параметров - он находится в следующем пространстве имен: Acme.ObjectModel.

В пользовательском контроле у ​​меня есть следующее:

<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', у которого нет параметров.

Итак, мои вопросы:

  1. Использую ли я ObjectDataSource неправильно?
  2. Есть ли более правильный способ использовать ObjectDataSource в этой ситуации?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 03 декабря 2008

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

Кроме того, свойство TypeName в ObjectDataSource должно ссылаться на имя типа указанного выше отдельного объекта. Пример:

public class SampleDataObject
{
  public ICollection<OurNewObject> GetTopUsers()
  {
    //[...]
  }
}

атрибуты, упомянутые выше: [System.ComponentModel.DataObject (true)] на уровне класса и [System.ComponentModel.DataObjectMethod (DataObjectMethodType.Select)] в методе getter не обязателен, но поможет в поддержке во время разработки, отфильтровывая другие типы при поиске классов для подключения вашего ObjectDataSource до.

0 голосов
/ 01 декабря 2008

Попробуйте добавить атрибут DataKeyNames (добавить первичный ключ) к GridView и посмотрите, работает ли он?

0 голосов
/ 20 ноября 2008

Я полагаю, что в проблеме отсутствуют два атрибута.

Сначала в вашем методе GetTopUsers () добавьте этот атрибут

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, true)]

Затем к фактическому классу OurNewObject добавьте этот атрибут

[System.ComponentModel.DataObject]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...