ASP.Net Repeater控件中的Item Command事件未被触发

20

好的,我已经使用repeater数百次而没有问题,但今天出了些问题。我有一个repeater并订阅了itemCommand事件,但是当我的命令运行时,页面会回传,但事件不会触发。

为了解决这个问题,我不得不在每次postback时都进行数据绑定。

我的repeater看起来像这样:

<asp:Repeater id="MyRepeater" runat="server" onitemcommand="MyRepeater_ItemCommand">
<ItemTemplate>
    <li>
    <asp:Label id="Label" runat="server" />
    <asp:LinkButton id="LinkButton1" runat="server" commandname="Complete" commandargument='<%# Eval("MyID") %>' text='<%# Eval("Title") %>' />
    </li>
</ItemTemplate>
</asp:Repeater>

我的代码如下:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
    SetupPage();
    }
}

private void SetupPage()
{
    // Do other stuff

    MyRepeater.DataSource = Repository.GetStuff()
    MyRepeater.DataBind();
}


protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{


// Do all my stuff here
}

我必须注释掉 if (!IsPostBack) 这一行才能调用 MyRepeater_ItemCommand。一旦注释掉并且重复器在每个 postback 上获取数据绑定,它就可以正常工作。我在许多其他页面上也这样做了,但在这个页面上似乎不起作用。

有其他人遇到过这种情况或者有解决方法吗?


如果可能,请向我们展示您页面的完整代码(标记和后端)。 - Bdiem
这个页面的视图状态已经开启了吗? - Tim Meers
完整的标记无法适应评论框,但页面中没有任何异常。使用主页面(主页面中没有禁用ViewState的引用),内容占位符,然后是一个重复器 - 非常简单。代码后台有一些更多的数据库/存储库访问代码,但仍然没有什么不寻常的。 - Ciaran O'Neill
12个回答

0

我不确定,但你可能需要为触发 ItemCommand 事件的按钮设置 CommandName 和可选的 CommandArgument 属性。否则 ASP.NET 将假定页面上没有按钮需要触发该事件。你可以尝试一下。

此外,如果你没有区分命令名称,为什么不使用每个按钮的 Click 事件呢?只需在重复器的 ItemCreatedItemDataBound 中订阅即可。


从上面的代码中可以看出,我已经指定了CommandName和CommandArgument。我已经有一个解决方法,即在每次回发时进行数据绑定 - 但我不想这样做。 - Ciaran O'Neill

0
尝试使用Page_init而不是Page_load,这应该可以解决问题。

不完全是这样。在 Init 事件中,“如果当前请求是回发,则尚未加载回发数据,并且控件属性值尚未恢复为视图状态中的值。”请参见:http://msdn.microsoft.com/en-us/library/ms178472.aspx - Venemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接