4

我试图在 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 时,它​​就像一个魅力(我的 ASP.NET Eval 在这种情况下指的是FullName而不是 DynamicProperties.FullName)。

一个主意?谢谢,奥米德。

4

1 回答 1

4

Eval需要object作为类型,而您提供dynamic. 因此,演员阵容将有助于使用Eval背后的独特属性:

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

或者简而言之:提供对象的动态需要像任何其他类型一样对待,因为它与对象不同。

于 2013-09-21T13:17:27.750 回答