Response.Redirect同一页RadioButtonList SelectedItem

时间:2011-10-20 17:03:00

标签: c# asp.net postback radiobuttonlist request.querystring

我正在尝试对我们网站上的工作列表进行工作过滤。作业类型的过滤器包含在UpdatePanel中,应用过滤器的按钮重定向回同一页面。

这是因为我将在XSLT中使用umbraco.library:RequestQueryString来填充作业列表。

但是,查询字符串过滤器值似乎没有选择RadioButtonList。例如:

页面加载,但没有任何反应,因为vt为null:

protected void Page_Load(object sender, EventArgs e)
    {
        string vt = Request.QueryString["vt"];

        if (vt != null)
        {
            foreach (ListItem li in rblVacancyType.Items)
            {
                if (li.Value == vt)
                {
                    li.Selected = true;
                }
            }
        }
    }


    <asp:UpdatePanel ID="upSearchFilters" runat="server">
                <ContentTemplate>
                    <p>
                        <asp:RadioButtonList ID="rblVacancyType" runat="server">
                            <asp:ListItem Text="All" Value="all"></asp:ListItem>
                            <asp:ListItem Text="Permanent" Value="permanent"></asp:ListItem>
                            <asp:ListItem Text="Temporary" Value="temporary"></asp:ListItem>
                        </asp:RadioButtonList>
                    </p>
</ContentTemplate>
</asp:UpdatePanel>

这是按钮:

<asp:ImageButton ID="ibFilters" ImageUrl="~/images/buttons/filter-button.png" OnClick="ibApplyFilters_Click" runat="server" />

以下是程序:

protected void ibApplyFilters_Click(object sender, EventArgs e)
    {
        Response.Redirect("/careers/join-us/?filters=true&vt=" + rblVacancyType.SelectedValue.ToString());  
    }

然而,当页面第一次重定向时,没有选择任何内容,我点击永久,永久被选中。如果我然后选择“全部”或“临时”,则选择不会改变。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

根据行为(它第一次运作)我相信这描述了正在发生的事情:

  • MyPage.aspx(原始载入)
  • 页面控件已初始化为默认值
  • 页面加载 - 没有查询字符串,没有选择单选按钮

(用户点击按钮 - 导致回发)

  • MyPage.aspx(回发)
  • 页面控件已初始化为默认值
  • 从ViewState设置单选按钮
  • 页面加载 - 没有查询字符串,没有选择单选按钮
  • ButtonClick - 使用单选按钮设置,响应重定向

  • MyPage.aspx?VT =永久(从重定向加载)

  • 页面控件已初始化为默认值
  • 页面加载 - 查询字符串集,选中单选按钮

(用户点击按钮 - 导致回发)

  • MyPage.aspx?VT =永久(回发)
  • 页面控件已初始化为默认值
  • 从ViewState设置单选按钮
  • 页面加载 - 查询字符串集,单选按钮设置为永久(这是问题)
  • ButtonClick - 使用单选按钮设置,执行响应重定向

我相信一个简单的(if!IsPostback)会解决问题

答案 1 :(得分:0)

听起来像是重新应用了回发值。请参阅有关ASP.NET页面生命周期的这篇文章:http://msdn.microsoft.com/en-us/library/ms178472.aspx

在page_load之后,通过回发重新应用控件的值。

答案 2 :(得分:0)

由于代码+回发的奇怪性质,Mark的答案中的逻辑似乎非常准确,但建议的修复不起作用,因为我已经尝试过这个可能的解决方案。以下是一个修改,但据我所知,它的工作原理。试一试,它可能适合你。

<form id="form1" runat="server">
    <div>

         <asp:ScriptManager ID="ScriptManager1" runat="server">
         </asp:ScriptManager>

         <asp:UpdatePanel ID="upSearchFilters" runat="server">
                <ContentTemplate>
                    <p>
                        <asp:RadioButtonList ID="rblVacancyType" runat="server"  
                            AutoPostBack="True">
                            <asp:ListItem Text="All" Value="all"></asp:ListItem>
                            <asp:ListItem Text="Permanent" Value="permanent"></asp:ListItem>
                            <asp:ListItem Text="Temporary" Value="temporary"></asp:ListItem>
                        </asp:RadioButtonList>

                    </p>
                    <p>
                        <asp:ImageButton ID="ibFilters" runat="server" CausesValidation="False" 
                            Height="30px" OnClick="ibApplyFilters_Click" />
                    </p>
                </ContentTemplate>
         </asp:UpdatePanel>

    </div>

</form>

代码背后:

protected void Page_Load(object sender, EventArgs e)
{
   ibFilters.PostBackUrl = "~/WebForm1.aspx?filters=true&vt=" + rblVacancyType.Text;
   string vt = Request.QueryString["vt"];    
}

重要:

设置方式,它将保持您的选择,在按钮按下时更新网址中的过滤器参数,然后为vt分配正确的值,用于过滤页面上的任何其他内容。

你必须为你的网址更改我的“〜/ WebForm1.aspx?filters = true&amp; vt =”。