Потенциальная причина бесконечного цикла при привязке к свойству из SelectParameter объекта ObjectDataSource? - PullRequest
0 голосов
/ 21 февраля 2012

Я пытаюсь декларативно привязаться к DropDownList после фильтрации ObjectDataSource на основе выбранных значений в RadListBox. Что еще хуже, я должен сделать декларативное связывание между элементами управления.

Поскольку я не мог связать SelectParameters со своим свойством ListBox.SelectedItems, я попытался унаследовать от RadListBox и предоставить свойство для приведения IList к объекту. Тогда в моем сервисе примите объект в качестве параметра. Однако по какой-то причине это свойство называется бесконечно.

Markup:

<cust:CustomListBox ID="listTypes" 
                    AutoPostBack="true"
                    EnableLoadOnDemand="true"
                    DataTextField="Text" 
                    DataValueField="Value" 
                    DataSourceID="listTypesDataSource"
                    EnableEmbeddedSkins="false"
                    SelectionMode="Multiple"
                    runat="server" />

<cust:RadComboBox ID="aggregatedCompetitors1" 
                    AutoPostBack="true" 
                    DataSourceID="aggregatedCompetitors1DataSource" 
                    DataTextField="Text" 
                    DataValueField="Value" 
                    runat="server" />

<cust:ObjectDataSource ID="listTypesDataSource"
                      TypeName="TestServices.TestService"
                      SelectMethod="GetProductTypes"
                      runat="server" />

<cust:ObjectDataSource ID="aggregatedCompetitors1DataSource"
                      TypeName="TestServices.TestService"
                      SelectMethod="GetCompetitors1"
                      runat="server">
    <SelectParameters>
        <asp:ControlParameter Name="productTypes" 
                              ControlID="listTypes"
                              Type="Object"
                              PropertyName="SelectedValuesAsObject" />
    </SelectParameters>
</cust:ObjectDataSource>

Код:

public class CustomListBox : RadListBox
{
    public object SelectedValuesAsObject
    {
        get
        {
            return (object)this.SelectedItems;
        }
    }
}

Мой тестовый класс обслуживания.

public class TestService
{
    public List<ListItem> GetProductTypes()
    {
        return ProductTypes();
    }

    public List<ListItem> GetCompetitors1(object productTypes)
    {
        IList<RadListBoxItem> selectedItems = (IList<RadListBoxItem>)productTypes;
        List<ListItem> aggregatedValues = new List<ListItem>();

        foreach(var selectedValue in selectedItems)
        {
            aggregatedValues.AddRange(Compeitors().Where(c => c.CompType == selectedValue.Value)
                .Where(c => c.Brand.In("Ford", "HP")));
        }

        return aggregatedValues;
    }

    private List<ListItem> ProductTypes()
    {
        return new List<ListItem>()
        {
            new ListItem("computers", "Computers"),
            new ListItem("cars", "Cars")
        };
    }

    private List<ListItem> Compeitors()
    {
        return new List<ListItem>()
        {
            new ListItem("Ford Tauris", "cars", "Ford"),
            new ListItem("Ford Escort", "cars", "Ford"),
            new ListItem("Ford Ranger", "cars", "Ford"),
            new ListItem("HP 2000z Series", "computers", "HP"),
            new ListItem("HP Pavillion g6t", "computers", "HP"),
            new ListItem("HP Pavillion g6z", "computers", "HP"),
            new ListItem("Chevy Impala", "cars", "Chevy"),
            new ListItem("Chevy Malibu", "cars", "Chevy"),
            new ListItem("Chevy Silverado", "cars", "Chevy"),
            new ListItem("Dell Precision T3500", "computers", "Dell"),
            new ListItem("Dell Precision T2500", "computers", "Dell"),
            new ListItem("Dell Latitude 2120", "computers", "Dell")
        };
    }
}

Трассировка стека: Stack Trace

...