20

好的,我已经使用中继器数百次没有问题,但今天出了点问题。我有一个转发器,并且我正在订阅 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>

我的代码隐藏是这样的:

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。一旦将其注释掉并且中继器在每次回发时都获得数据绑定,它就可以正常工作。我已经在许多其他页面中完成了此操作,但在此页面上似乎不起作用。

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

4

12 回答 12

24

很可能,您已禁用该页面的 ViewState。

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

如果禁用视图状态,则回发期间不会重建控件树,因此应接收事件的控件不存在于内存中。所以事件就死了。

如果您真的想禁用视图状态,但仍想接收事件,我有一个解决方法(而且它一点也不脏)。我一直在考虑写一篇关于它的博客文章,所以如果你愿意,我可以从我的日常琐事中抽出一点时间来描述它。

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

于 2009-08-24T12:56:02.753 回答
6

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

于 2011-11-22T18:15:08.370 回答
5

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

于 2015-11-13T03:05:55.110 回答
2

我删除了链接按钮中的PostBackUrl属性并触发了 ItemCommand。我认为回发首先运行。

于 2012-06-22T07:51:22.363 回答
2

当我使用 ImageButton 时,我在转发器中遇到了这个问题......当 LinkBut​​ton 工作时,我已经在网上搜索这个解决方案,但不是 ImageButton......

然后我想,LinkBut​​ton 有用吗?所以我会用它:)

<asp:LinkButton  CommandName="Filter" CommandArgument='<%# Eval("ID") %>' Text="" runat="server" >
<asp:image imageurl='<%#Eval("Img") %>' runat="server"/>

</asp:LinkButton> 

所以,图像在<A>标签内

玩得开心 :)

于 2012-02-16T07:18:38.913 回答
1

那可能是您在页面上设置了验证。所以设置一个新属性,causevaliation = "false" 到链接按钮。M确定它会解决问题

于 2014-03-07T09:22:10.070 回答
1

我有一个类似的问题 - 原来一些谨慎的验证控件正在页面上的其他地方触发。我只花了一天的时间就弄明白了...

于 2014-04-24T12:46:16.380 回答
0

我对此并不肯定,但您可能必须为导致ItemCommand事件的按钮设置CommandName和可选的CommandArgument属性。否则 ASP.NET 将假定页面上没有您想要触发事件的按钮。你可以试试。

另外,如果您不区分命令名称,为什么不使用每个按钮的 Click 事件呢?只需订阅转发器的ItemCreatedItemDataBound中的那些。

于 2009-08-24T13:10:46.267 回答
0

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

于 2009-10-23T03:36:14.623 回答
0

尝试这个:

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

如果你使用嵌套重复器,你应该重新绑定你的内部重复

于 2012-10-30T14:16:47.340 回答
0

这是您必须在后面的代码中使用的代码..

在 PageLoad 事件之后,

 protected void Page_Load(object sender, EventArgs e)
 {

 }


 protected void Page_LoadComplete(object sender, EventArgs e)
 {
      // Bind Your Repeater here
      rptUser();
 }

现在您可以触发您的 Itemcommand..如果您得到输出,请将答案标记为正确,谢谢

于 2016-03-05T06:08:27.010 回答
0

另一件事可能是(因为它刚刚发生在我身上):如果您的数据绑定发生在您的页面预呈现时,它将不会处理 item 命令。将其切换为加载或初始化,你会没事的。

于 2016-12-01T01:01:35.000 回答