【问题标题】:ASP.Net repeater Item Command not getting firedASP.Net 中继器项目命令没有被触发
【发布时间】:2009-08-24 12:01:51
【问题描述】:

好的,我已经使用中继器数百次了,但今天出了点问题。我有一个转发器,并且我正在订阅 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。一旦将其注释掉并且转发器在每次回发时都获得数据绑定,它就可以正常工作。我在很多其他页面上都这样做过,但在这个页面上似乎不起作用。

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

【问题讨论】:

  • 尽可能向我们展示您页面的完整代码(标记和后端)。
  • 您是否为此页面打开了视图状态?
  • 完整的标记不适合 cmets 框,但页面中没有任何异常。使用母版页(也没有提及在母版页中禁用 ViewState)和内容占位符,然后是转发器 - 非常简单。后面的代码有更多的数据库/存储库访问代码,但也没什么异常

标签: asp.net repeater itemcommand


【解决方案1】:

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

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

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

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

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

【讨论】:

  • +1,过去我对视图状态有同样的问题。 (我想知道你的解决方法)
  • +1 这更有意义。也许将此添加到您的答案中。 msdn.microsoft.com/en-us/library/ms972976.aspx
  • 不,ViewState 已启用(反正我没有在应用程序的任何地方禁用它)
  • 哦,当我没有绑定每个回发时,页面上的其他数据绑定项目保持它们的状态,所以我真的不认为这是一个 ViewState 问题
  • +1 很棒的描述。看到这种解决方法也可能很高兴。我在一个沉重的页面上使用项目命令,这使得它不得不拖住视图状态。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      当我使用 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> 
      

      所以,图片在&lt;A&gt; 标签内

      玩得开心:)

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我遇到了类似的问题 - 页面上的其他地方出现了一些谨慎的验证控件。我只花了一天的时间就弄明白了...

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

              • 从上面的代码可以看出,我指定了一个CommandName 和一个CommandArgument。我已经通过在每个回发上进行数据绑定来解决这个问题 - 但我不想这样做
              【解决方案9】:

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

              【讨论】:

              【解决方案10】:

              试试这个:

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

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

              【讨论】:

                【解决方案11】:

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

                在 PageLoad 事件之后,

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

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

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多