当从ObjectDataSource的Select Parameter绑定到Property时,无限循环的潜在原因?

时间:2012-02-21 04:00:14

标签: c# asp.net objectdatasource infinite-loop radlistbox

我正在尝试基于RadListBox中的选定值过滤ObjectDataSource后声明性地绑定到DropDownList。更糟糕的是,我必须以声明方式对控件进行绑定。

由于我无法将SelectParameters绑定到ListBox.SelectedItems属性,因此我尝试从RadListBox继承并提供一个Property来将IList强制转换为object。然后在我的服务中接受对象作为参数。但是,出于某种原因,该属性被无限调用。

标记:

<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

0 个答案:

没有答案