ObjectDataSource et Guid, propriété non trouvée en ASP.NET

Lorsque l’on veut utiliser un GridView pour ajouter/modifier/supprimer des données dans une table SQL qui a pour clé primaire un **Guid **(par exemple aspnet_Users), une erreur survient lorsque l’on veut modifier ou supprimer un élément :

Could not find a property named 'xxx' on the type specified by the DataObjectTypeName property in ObjectDataSource 'yyy'

Tout semble pourtant bien configurer, mais l’erreur persiste. J’ai été confronté à ce problème avec la table aspnet_Users, qui contient les utilisateurs créés avec le système interne d’ASP.NET.

Voici ma solution au problème, je ne garantis pas qu’elle soit optimale. Elle se base sur la table aspnet_Users.

Après plusieurs recherches sur Google, j’ai trouvé la solution suivante : Supprimer le contenu de l’attribut DataObjectTypeName qui contient normalement System.Guid.

Chez moi cette solution ne fonctionne pas.

La solution que je vous propose est de convertir ce _**Guid **_en _**nvarchar **_lors de la récupération de nos données. Ce _**nvarchar **_sera ensuite passer en argument des méthodes **_Update _**et Delete. Concrétement la requête de récupération des données sera de ce type :

SELECT u.UserId, CAST(u.UserId AS nvarchar(MAX)) AS UserIdStr, u.UserName
FROM aspnet_Users u

GridView

Du côté ASPX, il faut mettre UserIdStr comme valeur de **la propriété **DataKeyNames et rendre les colonnes UserIdStr et UserId non visible et en readonly. Le code du GridView ressemble à ceci :

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="ObjectDataSource1" DataKeyNames="UserIdStr">
  <Columns>
    <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
    <asp:BoundField DataField="UserId" HeaderText="UserId"
    SortExpression="UserId" Visible="false" ReadOnly="true" />
    <asp:BoundField DataField="UserName" HeaderText="UserName"
    SortExpression="UserName" />
    <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
    <asp:CheckBoxField DataField="IsApproved" HeaderText="IsApproved"
    SortExpression="IsApproved" />
    <asp:BoundField DataField="UserIdStr" HeaderText="UserIdStr"
    SortExpression="UserIdStr" Visible="false" ReadOnly="true" />
  </Columns>
</asp:GridView>

Et l'ObjectDataSource ressemble à ceci :

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
DeleteMethod="Delete" SelectMethod="FetchAll"
TypeName="Project.Business.BLLUsers" UpdateMethod="Update">
  <DeleteParameters>
    <asp:Parameter Name="UserIdStr" Type="String" />
  </DeleteParameters>
  <UpdateParameters>
    <asp:Parameter Name="UserIDStr" Type="String" />
    <asp:Parameter Name="Username" Type="String" />
    <asp:Parameter Name="Email" Type="String" />
    <asp:Parameter Name="IsApproved" Type="Boolean" />
  </UpdateParameters>
</asp:ObjectDataSource>

Dans mon cas, les méthodes Update et Deleteappellent des procédures stockées qui prennent pour identifiant un paramètre de type nvarchar(MAX).

Si vous trouvez une autre méthode pour arriver au même résultat, faites moi signe :).

ASP.NET  C# 

Voir également