我已经设置了我认为正确的标记和代码,将下拉列表放在转发器的标头模板中,但由于某种原因,它无法正常工作。最初我看到下拉列表,但是当我在列表中进行选择时,OnSelectedIndexChanged事件似乎没有触发使用添加的方法来处理它,我无法弄清楚我错过了什么,因为我认为这是一件简单的事情。
以下是标记的要点:
<asp:Repeater ID="repNewsItems" runat="server">
<HeaderTemplate>
<asp:DropDownList ID="ddDateSortCategories" runat="server" Width="200" AutoPostBack="true" OnSelectedIndexChanged="ddDateSortCategories_SelectedIndexChanged1" CssClass="mergersDropDown">
<asp:ListItem Selected="True" Text="Most Recent" Value="newest"></asp:ListItem>
<asp:ListItem Text="Oldest" Value="oldest"></asp:ListItem>
</asp:DropDownList>
</HeaderTemplate>
<ItemTemplate>
// other stuff
以下是代码背后的内容:
[MacroParameter(MacroParameterType.Number)]
public int PageId { get; set; }
public string _category = "";
protected void Page_Load(object sender, EventArgs e)
{
if (repNewsItems == null) return;
_category = Request.QueryString["category"];
repNewsItems.ItemDataBound += new RepeaterItemEventHandler(repNewsItems_ItemDataBound);
repNewsItems.DataSource = (string.IsNullOrEmpty(NewsNodeIds))
? GetNewsItemsForYear(NewsYearToDisplay, _category)
: DaNews;
repNewsItems.DataBind();
}
protected void ddDateSortCategories_SelectedIndexChanged1(object sender, EventArgs e)
{
DropDownList ddl = (DropDownList)(sender);
Response.Redirect(umbraco.library.NiceUrl(PageId) + "?category=" + Server.UrlEncode(ddl.SelectedValue.ToString()));
}
void repNewsItems_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
DropDownList ddl = (DropDownList)e.Item.FindControl("ddDateSortCategories");
if (!IsPostBack)
{
if (ddl != null)
{
ddl.DataSource = GetNewsItemsForYear(DocumentTypes.NewsItem.GetMostRecentYear(NewsCategoryToDisplay).ToString(), _category);
ddl.DataBind();
}
}
if (!String.IsNullOrEmpty((Request.QueryString["category"]))) ddl.Text = Request.QueryString["category"];
}
// other stuff
}
答案 0 :(得分:0)
我发现上面的代码存在两个问题。首先,我错误地将我的列表项绑定到我的下拉列表,我的意思是硬编码的列表项不会改变。但这并没有解决我的主要问题。是什么让我忘记包装这些:
repNewsItems.ItemDataBound += new RepeaterItemEventHandler(repNewsItems_ItemDataBound);
repNewsItems.DataSource = (string.IsNullOrEmpty(NewsNodeIds))
? GetNewsItemsForYear(NewsYearToDisplay, _category)
: DaNews;
repNewsItems.DataBind();
中的
if (!IsPostBack) {}
条件陈述。这意味着每次触发回发事件时,它都会进入Page_Load方法,将整个转发器重新绑定到其初始状态,并且永远不会让它传递给我的SelectedIndexChanged事件处理程序ddDateSortCategories_SelectedIndexChanged1。