Pergunta

Saudações!

Estou criando um User Control que irá exibir dados em um controle GridView. Estamos usando a arquitetura n-tier e os dados em questão é obtido a partir nosso banco de dados e voltou para nós como um ReadOnlyCollection. OurNewObject é uma classe que contém várias propriedades e um construtor vazio que leva sem parâmetros - é na seguinte namespace:. Acme.ObjectModel

No controle de usuário, eu tenho a seguinte:

<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>

Em trás código do usuário de controle, eu tenho o seguinte método pública:

public ReadOnlyCollection<OurNewObject> GetTopUsers()
{
    return (OurDataProxy.GetJustTheTopUsers());
}

Quando eu colocar o User Control em um formulário Web e executá-lo, eu recebo a seguinte mensagem:

ObjectDataSource 'ourDataSource' não encontrou um método não-genéricos 'GetTopUsers' que não tem parâmetros.

Então, minhas perguntas são:

  1. Am I usando o ObjectDataSource incorretamente?
  2. Existe uma maneira mais correta de usar o ObjectDataSource nesta situação?

Graças.

Foi útil?

Solução

Creio que a questão está faltando dois atributos.

Em primeiro lugar em suas GetTopUsers () Método de adicionar este atributo

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

Em seguida, na classe OurNewObject real adicionar este atributo

[System.ComponentModel.DataObject]

Outras dicas

Normalmente, você poderia criar um objeto separado que contém o método de acesso de dados (s), em vez de colocar os métodos no código-behind. O objeto separado pode ser uma instância ou estático, mas o próprio objeto deve ter um construtor sem parâmetros (ou nenhum construtor em todos).

Além disso, a propriedade NomeTipo no ObjectDataSource deve referenciar o NomeDoTipo do objecto separado acima mencionado. Exemplo:

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

Os atributos mencionados acima: [System.ComponentModel.DataObject (verdadeiro)] ao nível da classe, e [System.ComponentModel.DataObjectMethod (DataObjectMethodType.Select)] no método getter não são necessários, mas ajudará na sustentação de tempo de design, filtrando os outros tipos quando se olha para as classes para ligar yer ObjectDataSource até.

Tente adicionar o DataKeyNames (adicione a chave primária) atributo para o GridView e ver se isso funciona?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top