0

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

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

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

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

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());  
    }

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

有任何想法吗?

4

3 回答 3

1

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

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

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

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

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

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

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

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

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

于 2011-10-20T18:36:35.413 回答
0

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

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

于 2011-10-20T17:09:41.533 回答
0

由于代码+回发的奇怪性质,马克的回答中的逻辑似乎非常准确,但建议的修复没有奏效,因为我曾尝试将其作为可能的解决方案。下面是一个修改,但据我所知它是有效的。试一试,它可能对你有用。

<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"];    
}

重要的:

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

您还必须为您的 url 更改我的 "~/WebForm1.aspx?filters=true&vt=" 。

于 2011-10-20T19:05:17.070 回答