1

Salutations!Proper ObjectDataSource Utilisation

Je crée un contrôle utilisateur qui affichera des données dans un contrôle GridView. Nous utilisons une architecture n-tier et les données en question sont extraites de notre base de données et renvoyées en tant que ReadOnlyCollection. OurNewObject est une classe contenant plusieurs propriétés et un constructeur vide qui ne prend aucun paramètre - il se trouve dans l'espace de noms suivant: Acme.ObjectModel.

Dans le contrôle de l'utilisateur, je donne les résultats suivants:

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

Dans le code de contrôle de l'utilisateur derrière, je la méthode publique suivante:

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

Quand je place le contrôle de l'utilisateur sur un Formulaire Web et exécutez-le, j'obtiens le message suivant:

ObjectDataSource 'ourDataSource' n'a pas pu trouver une méthode non générique 'GetTopUsers' qui n'a pas pa rameters.

Mes questions sont les suivantes:

  1. ce que j'utilise le ObjectDataSource mal?
  2. Existe-t-il une manière plus appropriée d'utiliser ObjectDataSource dans cette situation?

Merci.

Répondre

0

Je crois qu'il manque deux attributs au problème.

d'abord sur votre GetTopUsers() Méthode ajouter cet attribut

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

ensuite sur la classe OurNewObject réelle ajouter cet attribut

[System.ComponentModel.DataObject] 
+0

Le problème est que OurNewObject est défini dans un autre assembly, donc je ne peux pas lui ajouter cet attribut. – Bullines

+0

Vous devrez alors vous lier d'une manière différente, juste obtenir la collection et définir la source de données, puis appeler databind à partir du codebehind. –

0

Essayez d'ajouter DataKeyNames (ajouter la clé primaire) attribut à la GridView et voir si cela fonctionne?

2

Normalement, vous créez un objet séparé qui contient vos méthodes d'accès aux données, plutôt que de placer les méthodes dans le code-behind. L'objet séparé peut être une instance ou statique, mais l'objet lui-même doit avoir un constructeur sans paramètre (ou pas de constructeur du tout).

En outre, la propriété TypeName sur ObjectDataSource doit référencer le nom de type de l'objet distinct mentionné ci-dessus. Exemple:

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

Les attributs mentionnés ci-dessus: [System.ComponentModel.DataObject (true)] au niveau de la classe, et à la méthode getter [System.ComponentModel.DataObjectMethod (DataObjectMethodType.Select)] ne sont pas requis, mais facilitera la prise en charge au moment de la conception en filtrant les autres types lors de la recherche de classes auxquelles vous pouvez ajouter ObjectDataSource.

Questions connexes