C # 4.0 Динамический объект с привязкой данных ASP.NET

Я пытаюсь отобразить в 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 (я упростил его для ясности и не включил объявление CustomerCollection, которое я использую в своей привязке 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;
            }
        }       
    }

При запуске приложения возникла следующая ошибка HttpException: DataBinding: «System.Dynamic.ExpandoObject» не содержит свойства с именем «FullName».

Я уверен, что что-то делаю не так, но не могу найти что. Когда я добавляю свойство с именем FullName в свой объект Customer и позволяю получателю возвращать DynamicProperties.FullName, он работает как шарм (мой ASP.NET Eval в данном случае ссылается на FullName, а не на DynamicProperties.FullName) .

Идея? Спасибо, Омид.


person Omid B.    schedule 03.02.2012    source источник
comment
может быть, _dynamicProperties не равно нулю? Тогда при вызове геттера FullName к нему не добавляется?   -  person Mike Ohlsen    schedule 03.02.2012
comment
Вы можете показать свой метод LoadAll?   -  person Jeremy Armstrong    schedule 03.02.2012
comment
@Jeremy: метод LoadAll был сгенерирован инструментом (CodeFluent Entities), поэтому он должен работать. Когда я ставлю трассировку (или даже отлаживаю VS), метод запускается и данные загружаются правильно. Если я удалю ItemTemplate, который ссылается на мой динамический объект, данные без проблем отображаются в GridView.   -  person Omid B.    schedule 03.02.2012
comment
@Mike: когда я выполняю пошаговую отладку через VS, я использую свойство DynamicProperties и добавляю динамическое свойство Title без каких-либо проблем. Когда я нажимаю F10 для продолжения обработки и шаг достиг #Eval (DynamicProperties.FullName), возникает описанное исключение. Это похоже на то, что DataBinding нарушает динамическое поведение.   -  person Omid B.    schedule 03.02.2012
comment
Вы получили исправление или обходной путь для этого?   -  person Burt    schedule 18.04.2012


Ответы (1)


Eval принимает object как тип, а вы предоставляете dynamic. Таким образом, приведение типов поможет и использование отдельного свойства, лежащего в основе Eval:

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

Или коротко: если объект предоставляется динамически, его нужно рассматривать как любой другой тип, поскольку он отличается от объекта.

person Joerg Krause    schedule 21.09.2013