2012-02-03 33 views
4

我想在ASP.NET GridView中显示使用动态对象动态创建的绑定对象的属性。在我的例子中,DynamicProperties.FullName是动态的。C#4.0使用ASP.NET DataBinding的动态对象

我的客户端代码:

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

一个想法? 谢谢, Omid。

+0

是否可以_dynamicProperties不为空?那么当调用getter时,FullName不会被添加到它? – 2012-02-03 14:59:12

+0

你能显示你的LoadAll方法吗? – 2012-02-03 14:59:42

+0

@Jeremy:LoadAll方法是由一个工具(CodeFluent实体)生成的,所以它应该可以工作。当我把痕迹(甚至VS调试),该方法被触发和数据正确加载。如果我删除了引用我的动态对象的ItemTemplate,那么在GridView中显示的数据没有任何问题。 – 2012-02-03 15:14:03

回答

4

评估需要object作为类型,而您提供dynamic。因此,铸造将帮助和使用不同属性的背后评估和演示

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

或短:其中对象提供动态需要像对待任何其他类型的,因为它是从对象不同。