【问题标题】:Save selected value of a dropdown list in a global variable将下拉列表的选定值保存在全局变量中
【发布时间】:2013-01-04 13:37:55
【问题描述】:

我正在尝试将下拉列表选择的值保存在一个 glbal 变量中。我在下拉列表中有很多国家,当我选择其中一个并按下按钮时:

protected void Button1_Click(object sender, EventArgs e)
    {
        Button2.Enabled = true;
        Button2.Visible = true;
        DropDownList1.Visible = true;

        DropDownList9.Items.Clear();


        if (!Class1.Search_Continent.Equals("-"))
        {
            SqlConnection conn1 = new SqlConnection(@"Data Source=AK-PC\MSSQLSERVER1;Initial Catalog=DB;Integrated Security=True");
            conn1.Open();
            SqlCommand cmd1 = new SqlCommand("Select Country_name FROM Country WHERE Continent_name='" + DropDownList1.SelectedValue + "'", conn1);
            SqlDataReader dr1;
            dr1 = cmd1.ExecuteReader();

            while (dr1.Read())
            { DropDownList9.Items.Add(dr1["Country_name"].ToString() + "\n"); }

            dr1.Close();
            conn1.Close();

}

protected void Button2_Click(object sender, EventArgs e)
    {
        // Redirect to Country page
        Class1.CountryName = DropDownList9.SelectedValue.ToString();
        Response.Redirect("Country.aspx", true);
    }

它不采用选定的值!它总是取下拉列表的第一个值! 请帮帮我!

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    您可能在回发时重新绑定 DropDownList9 并丢失了 SelectedValue

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostback)
        {
           //bind data
        }
    }
    

    【讨论】:

    • 将填充下拉列表的代码放到显示 //bind data 的位置
    • 您应该按照 rick 的建议在 if(!Is.PostBack) 中编写您想要发生的事情。
    • 我从数据库中填写下拉列表,并且代码不在页面加载中!
    【解决方案2】:

    它总是取下拉列表的第一个值

    如果您错误地填充数据,这在 Web 表单中很常见。你在哪里填充下拉列表?我要你在Page_Load 做这件事。我还要你没有把它包裹在像if (!IsPostBack) 这样的东西中。如果你在Page_Load 中放置一个调试断点,你会发现它是在Button2_Click 被调用之前 调用的。

    请记住,HTTP 是无状态的。这意味着需要在对服务器的每个请求上构建整个服务器端页面对象。 Page_Load 是该结构的一部分,it happens before event handlers do。所以可能发生的事情是:

    1. 用户请求初始页面。
    2. 您使用数据填充下拉列表。
    3. 您向用户显示页面。
    4. 用户选择一个选项并单击一个按钮,发出回发请求。
    5. 您破坏并重新填充下拉列表,将其恢复为默认状态。
    6. 您尝试获取选定的值,但该值现已消失。

    这个问题最常见的解决方案是在Page_Load中使用上述条件:

    protected void Page_Load(object sender, EventArgs e)
    {
        // some initial logic
        if (!IsPostBack)
        {
            // stuff that should only happen when the page first loads
            // for example, populating controls from the database
        }
        // any other logic, etc.
    }
    

    控件的值不需要在每次回发时重新填充,因为诸如视图状态之类的东西应该保持必要的数据可用。 (尽管如果你完全搞砸了,那么你可能需要再修补一些。)

    【讨论】:

    • @user1915452:那你在哪里填充它?问题的描述仍然表明每次回发都会重新填充它。您能否扩展问题中的代码以显示更多信息?
    • @user1915452:您可以(并且应该)对原始问题进行编辑。将代码放在注释中通常效果不佳。
    • @user1915452:一方面,您的代码包含 SQL 注入漏洞。你可能想解决这个问题:) 更重要的是......所以你在回发中填充它,然后在另一个回发中使用它?有趣的。这里可能还会发生更多事情。您可能会尝试在每个代码隐藏函数中设置一个断点并逐步完成页面的正常使用。每次访问一个函数时,检查下拉列表的状态并查看它是否具有选定的值或是否已重新填充。这至少应该缩小执行顺序并帮助定位问题。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多