【问题标题】:ASP.NET Dropdown list has a SelectedValue which is invalid because it does not exist in the list of itemsASP.NET 下拉列表有一个无效的 SelectedValue,因为它不存在于项目列表中
【发布时间】:2015-04-15 19:16:55
【问题描述】:

我的问题很简单,我找到了很多例子,但它们并不简明扼要。

下面是我的 aspx 文件中的标记

<asp:DropDownList ID="ddlCountry" DataTextField="CountryName" DataValueField="CountryCode" runat="server">
        </asp:DropDownList>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

下面是我的代码

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            LoadCountry();
            this.ddlCountry.SelectedValue = "USA";

        }
    }

    private void LoadCountry()
    {
        DataTable dtResult = null;
        dtResult = new DataTable("Countiers");
        dtResult.Columns.Add("CountryCode");
        dtResult.Columns.Add("CountryName");

        DataRow dtRow1 = dtResult.NewRow();
        dtRow1["CountryCode"] = "PAKISTAN";
        dtRow1["CountryName"] = "PAKISTAN";
        dtResult.Rows.Add(dtRow1);

        DataRow dtRow2 = dtResult.NewRow();
        dtRow2["CountryCode"] = "INDIA";
        dtRow2["CountryName"] = "INDIA";
        dtResult.Rows.Add(dtRow2);

        DataView dv = new DataView(dtResult);
        dv.Sort = "CountryName";

        this.ddlCountry.DataSource = dv;
        this.ddlCountry.DataBind();
        this.ddlCountry.Items.Insert(0, new ListItem("--Please Select--", "-1"));
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        this.ddlCountry.SelectedValue = "USA";
    }
}

我只是在调用 LoadCountry 方法后的初始页面加载事件期间加载这个带有国家/地区的下拉列表,我将 selectedValue 设置为“USA”,这没有给出异常或错误。但是通过单击 Button1 回发后,我再次将 selectedValue 设置为“USA”,但这次发生了异常(有一个无效的 SelectedValue,因为它不存在于项目列表中)。我知道“USA”的值不在列表中,这就是它抛出异常的原因,但为什么它最初没有抛出该异常?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    这是一个记录在案的行为,但我实际上不知道这是什么原因:

    当所选值不在可用值列表中并执行回发时,将引发 ArgumentOutOfRangeException 异常。

    https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.selectedvalue%28v=vs.110%29.aspx

    【讨论】:

    • 理论上,原因很简单。 “选定”值映射到项目列表中的索引。您可以将下拉列表中的项目视为Dictionary&lt;KeyValuePair&lt;string, object&gt;&gt;。如果未找到该键,则无法解析此字典的索引。然而,字典中任何给定项的值实际上可能是null,因为这些项可以绑定到对象(框架在绑定时只是在它们上调用ToString())。因此,唯一安全的做法是在找不到匹配项时抛出异常。
    • 问题是“为什么只在回发期间?”
    • 如果您查看他的代码示例,他会在下拉列表中预加载值;有一些东西与所选值相匹配。在回发期间,这可能不会发生。在没有看到标记的情况下,我只能假设页面没有启用ViewState,或者控件的内容以其他方式发生了更改,因此所选值不再与有效项目列表一致。
    • 我尝试了与古玩相同的代码来查看这种行为。下拉列表已预加载,但“USA”值不存在。回发后,下拉菜单仍然有项目,并引发异常。因此,异常实际上仅在回发后引发,如我在我的答案中链接的 MSDN 页面中所述(“..并且执行了回发..”)。我的问题是问为什么框架设计者决定只在回帖后抛出异常?
    • 嘿。 :) 我不能告诉你为什么他们决定做任何事情。从算法上讲,我可以对什么是最有意义的做出有根据的猜测。 (好吧,那我可以使用 Reflector 或 Resharper 掠夺源代码。)但是在框架中有很多地方做出了看似奇怪的决定,但是一旦你了解了它们背后的原因,你就会发现自己“哦。 .. 这就是为什么。”通常,它是一个边缘案例,并不像您想象的那么极端。
    猜你喜欢
    • 2013-04-22
    • 1970-01-01
    • 2013-08-26
    • 2012-02-10
    • 2014-01-14
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多