Вопрос

Приветствую!

Я создаю пользовательский элемент управления, который будет отображать данные в элементе управления 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', у которого нет параметров.

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

  1. Использую ли я ObjectDataSource неправильно?
  2. Есть ли более правильный способ использовать 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 и посмотреть, сработает ли это?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top