2012-02-03 18 views
4

動的オブジェクトを使用して動的に作成されたバインドされたオブジェクトのプロパティをASP.NET GridViewに表示しようとしています。私の例では、DynamicProperties.FullNameは動的です。ASP.NETデータバインディングを使用する動的オブジェクト

私のクライアントコードは次のとおりです。

<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評価ではFullName、DynamicProperties.FullNameは参照されません)。

アイデア?ありがとうございました。

+0

_dynamicPropertiesがnullでない可能性がありますか? getterが呼び出されると、FullNameは追加されません。 –

+0

LoadAllメソッドを表示できますか? –

+0

@Jeremy:LoadAllメソッドはツール(CodeFluent Entities)によって生成されているので、動作するはずです。トレース(またはVSデバッグ)を置くと、メソッドがトリガされ、データが正しくロードされます。私の動的オブジェクトを参照するItemTemplateを削除すると、データはGridViewに問題なく表示されます。 –

答えて

4

Evalは、タイプとしてobjectを受け取りますが、dynamicを入力してください。だから、キャストが役立つと評価背後に異なる性質を利用します:

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

またはショート:それはオブジェクトと異なっているように、オブジェクトは、他のタイプのように扱わへの動的なニーズを提供しているところ。

関連する問題