使用ASP.NET DataBinding的C#4.0动态对象

时间:2012-02-03 14:36:25

标签: asp.net data-binding dynamicobject

我试图在ASP.NET GridView中显示使用动态对象动态创建的绑定对象的属性。在我的示例中,DynamicProperties.FullName是动态的。

我的客户代码是:

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

我的BLL代码是(为了清楚起见我简化了它,并且没有包含我在ASP.NET绑定中使用的CustomerCollection声明):

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

当我运行应用程序时,我收到以下HttpException错误: DataBinding:'System.Dynamic.ExpandoObject'不包含名称为'FullName'的属性。

我确信我做错了但却找不到什么。当我在Customer对象中添加一个名为FullName的属性并让getter返回DynamicProperties.FullName时,它就像一个charm(我的ASP.NET Eval在这种情况下引用 FullName 而不是DynamicProperties.FullName)

一个想法? 谢谢, OMID。

1 个答案:

答案 0 :(得分:4)

当您提供object时,

评估会将dynamic作为类型。因此,演员阵容将有助于使用 Eval

背后的独特属性
<%# (Container.DataItem as dynamic).FullName%>

或简短:在提供对象的地方,动态需要像对待任何其他类型一样对待。