ASP.Net转发器项目命令没有被触发

Cia*_*ill 20 asp.net repeater itemcommand

好吧,我已经使用了几十次中继器而没有任何问题,但今天出现了一些问题.我有一个转发器,我正在订阅itemCommand事件,但是当我的命令运行时,页面会回发但事件不会被触发.

为了解决这个问题,我必须在每个回发上进行数据绑定.

我的中继器看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

和我的代码隐藏是这样的:

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
}
Run Code Online (Sandbox Code Playgroud)

除非我注释掉if(!IsPostBack)行,否则不会调用MyRepeater_ItemCommand.一旦被注释掉并且转发器在每个回发上获得数据绑定,它就可以正常工作.我已经在很多其他页面中完成了这个,但就此而言似乎没有用.

其他人遇到这种行为或有解决方案吗?

Pet*_*ete 24

最有可能的是,您已禁用该页面的ViewState.

原因是当您执行回发时,转发器中的所有控件都通常从视图状态中的数据重建.然后,根据控件的ID识别应该接收事件的对象,并路由事件.

如果禁用视图状态,则在回发期间不会重建控制树,因此内存中不存在应该接收事件的控件.事件就此消失了.

如果你真的想要禁用视图状态,但仍想接收事件,我有一个解决方法(并且它根本不是脏的).我一直在考虑写一篇关于它的博客文章,所以如果你愿意的话,我可以花点时间摆脱我的正常琐事,并描述一下.

编辑:此处描述了解决方法:http://petesdotnet.blogspot.dk/2009/08/asp.html


小智 6

删除,if (!IsPostBack)因为这会阻止转发器重新绑定,并且item命令事件在回发后找不到该行.


Fra*_*aul 5

我有同样的问题,除了使用更新面板之外,我的模式中有一个必需的字段验证器。我发现转发器中的 LinkBut​​tons 触发了 requiredFieldValidor 事件,然后我在转发器的 LinkBut​​tons 中添加了 CausesValidation="false"。按预期工作。