4 votes

Objet dynamique C# 4.0 avec liaison de données ASP.NET

J'essaie d'afficher dans un GridView ASP.NET une propriété d'un objet lié qui a été créé dynamiquement à l'aide d'un objet dynamique. Dans mon exemple, DynamicProperties.FullName est dynamique.

Mon code client est :

<asp:ObjectDataSource runat="server" ID="CustomerDataSource" DataObjectTypeName="Customer" TypeName="CustomerCollection" SelectMethod="LoadAll" />

<asp:GridView ID="CustomerGridView" runat="server" AutoGenerateColumns="False" DataSourceID="CustomerDataSource" EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="FirstName" />
        <asp:BoundField DataField="LastName" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Label runat="server" Text='<%#Eval("DynamicProperties.FullName")%>' />
            </ItemTemplate>                
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Mon code BLL est le suivant (je l'ai simplifié pour plus de clarté et je n'ai pas inclus la déclaration CustomerCollection que j'utilise dans ma liaison ASP.NET) :

public partial class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        private dynamic _dynamicProperties;
        public dynamic DynamicProperties
        {
            get
            {
                if (_dynamicProperties == null)
                {
                    _dynamicProperties = new ExpandoObject();

                    _dynamicProperties.FullName = FirstName + " " + LastName;
                }
                return _dynamicProperties;
            }
        }       
    }

Lorsque j'exécute l'application, j'obtiens l'erreur HttpException suivante : DataBinding : System.Dynamic.ExpandoObject' ne contient pas de propriété portant le nom 'FullName'.

Je suis sûr que je fais quelque chose de mal mais je ne trouve pas quoi. Lorsque j'ajoute une propriété nommée FullName dans mon objet Client et que le getter renvoie DynamicProperties.FullName, cela fonctionne comme sur des roulettes (mon ASP.NET Eval renvoie à Nom complet dans ce cas et non DynamicProperties.FullName).

Une idée ? Merci, Omid.

4voto

Joerg Krause Points 725

Eval prend object comme type, tandis que vous fournissez dynamic . Donc un casting aidera et l'utilisation de la propriété distincte derrière. Eval :

<%# (Container.DataItem as dynamic).FullName%>

En bref, lorsque l'objet est fourni, le type dynamique doit être traité comme tout autre type, car il est différent de l'objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X