来自ListItems列表的DataBinding asp.net DropDownList导致System.ArgumentOutOfRangeException错误

时间:2014-12-04 15:47:37

标签: c# asp.net mvp system.web.ui.webcontrols

我正在尝试使用System.Web.UI.WebControls.ListItems的Collections.Generic.List来DataBind一个asp:DropDownList。 DataBind()抛出了这个错误。

  

System.ArgumentOutOfRangeException:'ddlPlatinumOptions'有一个SelectedValue无效,因为它在项目列表中不存在。

的.ascx

<asp:DropDownList ID="ddlPlatinumOptions" runat="server" AutoPostBack="true" width="100%"></asp:DropDownList>

.ascx.cs

public void BindPlatinumOptions()
{
    ddlPlatinumOptions.DataTextField = "Text";
    ddlPlatinumOptions.DataValueField = "Value";
    ddlPlatinumOptions.DataSource = _platinumOptions;
    ddlPlatinumOptions.DataBind(); // Throwing Error
}

呈现

MattressProtectionInfo standard = RF_ProtectionPlan.GetMattressPlanInfo(MattressId, false);
MattressProtectionInfo premium = RF_ProtectionPlan.GetMattressPlanInfo(MattressId, true);
List<ListItem> plans = new List<ListItem>();                  
if (standard != null)
{
    plans.Add(new ListItem(standard.Price.ToString("C") + " - Standard 5-Year Platinum Protection", standard.ProductID.ToString()));
}
if (premium != null)
{
    plans.Add(new ListItem(premium.Price.ToString("C") + " - Premium 5-Year Platinum Protection", premium.ProductID.ToString()));
}

_view.PlatinumOptions = plans;
_view.BindPlatinumOptions();

数据示例

  • Value =“21696”Text =“99.95美元 - 标准的5年白金保护”
  • Value =“21702”Text =“$ 119.95 - 优质5年白金保护”

我试过了

  • 在我的数据之前清空数据源和数据绑定以清除任何内容(同时打破dataBind)
  • 重新定位DataTextField和DataValueField的位置(浪费时间 - 没有变化)
  • 在数据绑定
  • 之前声明选定的索引为0
  • ddlPlatinumOptions.Items.Clear();
  • ddlPlatinumOptions.ClearSelection();

我抓住吸管。似乎数据绑定器试图在下拉列表中选择不存在的内容。

我的代码中是否有错误,我没有看到?任何想法?

2 个答案:

答案 0 :(得分:2)

嗯,它超出范围异常。在绑定到DropDownList之前,您是否在任何时候将SelectedIndex设置为默认值?

答案 1 :(得分:2)

在遇到这个问题之后,我调试了ASP.NET源代码并在ASP.NET源代码中找到了一个缺陷(?)(因此,我们的问题的解决方案):

在内部,System.Web.UI.WebControls.Listcontrol缓存最近使用的SelectedValue。因此,在SelectedValue已经设置SelectedValue之后发生数据绑定(本机清除Request.Form[]属性)时,数据绑定操作会尝试查找并预先选择以前缓存的数据项目。不幸的是,如果在新的DataSource列表中找不到缓存的值而不是静默地保留当前的SelectedValue null值,则会引发异常。

我猜他们这样做是因为当使用ViewState 数据源对象进行数据绑定时,后来的数据绑定操作会删除SelectedValue获取的Request.Form[] }。

因此,每当您在页面生命周期内对ListControl执行多个数据绑定操作以及数据源不同时,就会发生此异常。


这是ASP.NET代码简介:

    public virtual string SelectedValue
    {
        set
        {
            if (Items.Count != 0)
            {
                // at design time, a binding on SelectedValue will be reset to the default value on OnComponentChanged
                if (value == null || (DesignMode && value.Length == 0))
                {
                    ClearSelection();
                    return;
                    // !!! cachedSelectedValue is not getting reset here !!!
                }

            ...

            // always save the selectedvalue
            // for later databinding in case we have viewstate items or static items
            cachedSelectedValue = value;
        }
    }


以下是解决方案:

而不是:

    dropDownBox.DataSource = ...;
    dropDownBox.DataBind();

写下这个:

    dropDownBox.Items.Clear();
    dropDownBox.SelectedValue = null;
    dropDownBox.DataSource = ...;
    dropDownBox.DataBind();


(仅当dropDownBox.Items.Clear();已经为空时,才需要dropDownBox.Items操作。)