Proper ObjectDataSource Use
-
08-07-2019 - |
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:
- Am I usando o ObjectDataSource incorretamente?
- Existe uma maneira mais correta de usar o ObjectDataSource nesta situação?
Graças.
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?