Pregunta

¡Saludos!

Estoy creando un Control de usuario que mostrará datos en un control GridView. Estamos utilizando una arquitectura de n niveles y los datos en cuestión se recuperan de nuestra base de datos y se nos devuelven como ReadOnlyCollection. OurNewObject es una clase que contiene varias propiedades y un constructor vacío que no toma parámetros; está en el siguiente espacio de nombres: Acme.ObjectModel.

En el control de usuario, tengo lo siguiente:

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

En el código del Control de usuario, tengo el siguiente método público:

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

Cuando coloco el Control de usuario en un formulario web y lo ejecuto, aparece el siguiente mensaje:

ObjectDataSource 'ourDataSource' no pudo encontrar un método no genérico 'GetTopUsers' que no tiene parámetros.

Entonces mis preguntas son:

  1. ¿Estoy usando ObjectDataSource incorrectamente?
  2. ¿Hay una forma más adecuada de usar ObjectDataSource en esta situación?

Gracias.

¿Fue útil?

Solución

Creo que al problema le faltan dos atributos.

Primero en su Método GetTopUsers () agregue este atributo

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

Luego, en la clase OurNewObject real, agregue este atributo

[System.ComponentModel.DataObject]

Otros consejos

Normalmente, crearía un objeto separado que contiene sus métodos de acceso a datos, en lugar de colocar los métodos en el código subyacente. El objeto separado puede ser una instancia o estático, pero el objeto en sí debe tener un constructor sin parámetros (o ningún constructor).

Además, la propiedad TypeName en ObjectDataSource debe hacer referencia al nombre de tipo del objeto separado mencionado anteriormente. Ejemplo:

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

Los atributos mencionados anteriormente:  [System.ComponentModel.DataObject (true)] en el nivel de clase, y  [System.ComponentModel.DataObjectMethod (DataObjectMethodType.Select)] en el método getter no es necesario, pero ayudará en el soporte en tiempo de diseño al filtrar otros tipos al buscar clases para conectar su ObjectDataSource hasta.

Intente agregar el atributo DataKeyNames (agregue la clave principal) al GridView y vea si eso funciona?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top