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个回答

24

很可能您已经禁用了页面的ViewState。

原因是当您执行postback(页面回发)时,所有Repeater中的控件都会从ViewState中重建。然后通过控件的ID标识出应该接收事件的对象,并将事件路由到它。

如果禁用viewstate,则在postback期间不会重建控件树,因此应该接收事件的控件不存在于内存中。 因此事件将无法被处理。

如果您真的想禁用viewstate,但仍希望接收事件,我有一个解决方法(并且它一点也不糟糕)。 我一直在考虑写一篇关于它的博客文章,所以如果您愿意,我可以抽出一点时间来描述它。

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


+1,过去我也遇到了ViewState的同样问题。(我想知道你的解决方法) - Cleiton
+1 这样更有意义。也许将此添加到您的答案中。http://msdn.microsoft.com/en-us/library/ms972976.aspx - Bdiem
不,ViewState 是启用的(无论如何我都没有在应用程序中禁用它)。 - Ciaran O'Neill
哦,页面上的其他数据绑定项在每次回发时保持其状态,因此我真的不认为这是一个ViewState问题。 - Ciaran O'Neill
+1个很好的描述。看到那个解决方法也很不错。我在一个很重的页面上使用了Item Command,它使得携带视图状态更加繁琐。 - Tim Meers
@Ciaran - 这听起来很奇怪,因为你说如果在 postback 期间重新绑定 repeater,则可以正常工作。这确实像是 repeater 由于某种原因未被反序列化。可能有其他代码在某处意外清除了 repeater。对于其他感兴趣的人,我在这里描述了我的无视图状态 repeater 事件解决方法。http://petesdotnet.blogspot.com/2009/08/asp.html - Pete

6

移除 if (!IsPostBack),因为这会防止重复绑定, 并且在 postback 后,项命令事件无法找到行。


5

我有同样的问题,除了使用update panel外,在我的模态框中还有一个必填字段验证器。我发现重复器中的LinkButton会触发requiredFieldValidor事件,然后我在重复器中的LinkButton中添加了CausesValidation="false"。按预期工作。


2

当我在Repeater中使用ImageButton时,遇到了问题......

之前在网上搜寻了解决方案,但是找到的都是针对LinkButton而非ImageButton的......

于是我想,既然LinkButton可行,那我就使用它吧 :)

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

</asp:LinkButton> 

所以,图片位于<A>标签内部。
祝您玩得愉快 :)

2

我在LinkButton中移除了PostBackUrl属性,然后触发了ItemCommand事件。我认为PostBack会先执行。


1

我曾经遇到过类似的问题 - 结果发现页面上其他地方正在触发一些离散的验证控件。花了我一天时间才找出来...


1
也许您在页面上设置了验证。因此,请为链接按钮设置一个新属性,causevalidation =“false”。我确定它会解决问题。

0
这是您必须在代码后端使用的代码。
在PageLoad事件之后,
 protected void Page_Load(object sender, EventArgs e)
 {

 }


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

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


0

试试这个:

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

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

0
另外还有一件事情可能会发生(就像我刚遇到的):如果您的数据绑定发生在页面预呈现时,它将不会处理项目命令。将其切换到加载或初始化状态,问题就会解决。

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