【问题标题】:Can't get to rebind a Repeater after firing ItemCommand (using asyncpostback via updatepanel)触发 ItemCommand 后无法重新绑定中继器(通过更新面板使用异步回发)
【发布时间】:2011-07-14 14:21:37
【问题描述】:

场景如下:

我在一个名为 updPanel 的 UpdatePanel 中有一个中继器。

在这个中继器内我有两个按钮,它们会触发一个 ItemCommand。

在页面加载中我有这个方法:

if (!IsPostBack)
{               
    Bind();
}

然后,在 Bind() 上:

public void Bind()
{
    rptList.DataSource = Model.GetData(Version);
    rptList.DataBind();
}

然后,在 ItemCommand 事件上:

public void rptList_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    //Some code to get info about the DataItems
    if (e.CommandName.Equals("MyCommandName1"))
    {
        //Do Stuff
    }
    else if (e.CommandName.Equals("MyCommandName2"))
    {
        //Do Other Stuff
    }
    Bind();
}

我有一个按钮(在同一个更新面板内,但在中继器之外)除了 Bind() 之外什么都不做。

当我单击 ItemCommand 时,该命令会执行,但屏幕不会更新(其中一个项目按钮应在单击后更改其图标)。如果我刷新页面,或者单击“绑定”按钮,中继器会按预期显示数据。

为什么在ItemCommand之后没有绑定?

提前致谢!

编辑:我的中继器:

<asp:Repeater ID="rptList" runat="server">
    <HeaderTemplate>
        <h3>
            <b class="rollback">Rollback</b> | <b class="emteste">Em Teste</b> | <b class="aindanaoincluido">
                            Ainda não Incluído</b> | <b class="parcialmenteok">Atividade Parcialmente OK</b>
                        | <b class="todosok">Atividade OK em Todas as Lojas</b> | <b class="publicado">Atividade
                            Publicada</b>
        </h3>
    </HeaderTemplate>
    <ItemTemplate>
        <div class="item" style="display: inline-block">
            <p style="font-size: 12px">
                <asp:ImageButton ToolTip="Marcar como Rollback" ImageUrl="/_layouts/Extensions/Versioning/img/rollback.png"
                                CommandName="MarkAsRollback" ID="btnItemRollback" CssClass="itembutton" runat="server" />
                <asp:ImageButton ToolTip="Esta atividade possui código. Clique para sinalizar como apenas procedure/config"
                                ImageUrl="/_layouts/Extensions/Versioning/img/code.png" CommandName="MarkAsProc"
                                ID="btnItemProc" CssClass="itembutton" runat="server" />
                 <asp:Image ToolTip="Esta atividade não possui scripts de banco/zips." ImageUrl="/_layouts/Extensions/Versioning/img/noscript.png"
                                runat="server" CssClass="itembutton" ID="btnItemScript" />
                 <asp:Label ID="labelWI" Text="" runat="server"></asp:Label>
                 <span style="color: #4A82CB">
                                <%# DataBinder.Eval(Container.DataItem, "SystemAssignedTo") %>
                                - </span><span style="color: Navy">
                                    <%# DataBinder.Eval(Container.DataItem, "SystemTitle") %>
                                </span>
                 <asp:HiddenField ID="workItemID" runat="server" />
              </p>
         </div>
         <hr class="item" noshade style="color: #4CBDCB; height: 2px; background-color: #4CBDCB" />
     </ItemTemplate>
</asp:Repeater>

编辑:为了简化,这是我得到的行为:

点击中继器外的按钮:图标发生变化。数据库更新。

单击中继器中项目内的按钮:图标不会改变。数据库更新。

再次单击转发器中项目内的按钮:图标更改。数据库更新。但是现在对应的项是错误的,因为我已经再次更改了标志

这似乎与事情发生的顺序有关。

编辑:我忘了说,我用完整的回发进行了测试,一切正常。

【问题讨论】:

  • 您能否向我们展示您使用 Updatepanel 设计的 Repater?
  • 作为一个友好的建议,远离更新面板。在页面方法旁边使用 jQuery ajax :)
  • 您没有添加 AJAX Updatepanle 信息。您不需要添加完整的中继器,但您可以添加有问题的必要 if 规范,以帮助我们找出问题。
  • 哦,真的。但是 ajax UpdatePanel 并没有什么特别之处。它的 ContentTemplate 有一个按钮和这个中继器。 &lt;asp:UpdatePanel ID="updPanel" runat="server"&gt;

标签: asp.net updatepanel repeater itemcommand


【解决方案1】:

你什么时候加载myDataSource

如果您在Page_Load 中将数据加载到其中,该操作在rptList_ItemCommand 之前执行,那么bind() 会将一组旧数据绑定到转发器。这将解释您的第三个总结点:

再次单击中继器中项目内的按钮:图标更改。数据库更新。但是现在对应的项是错误的,因为我已经再次更改了标志

您能否向我们提供有关您的数据源和中继器外部按钮的事件处理程序的更多详细信息?

【讨论】:

  • 抱歉,如果我不小心弄不清楚了,但myDataSource 实际上是一种方法,特别是Model.GetData(Version)Version 是我通过查询字符串获得的属性。 GetData 从 wcf 服务获取数据。中继器外部按钮的事件处理程序与中继器内部的按钮执行完全相同的操作。
  • 到底是什么问题?
  • 我似乎把 rptList.ItemCommand 事件放在了错误的地方。现在一切正常。
  • 很容易完成 :) 我很高兴你最终能够让它工作!
【解决方案2】:

给您的问题 - 在单击项目按钮后,您希望看到哪些更改?您是在更新中继器中的按钮控件还是对数据源进行更改?

我怀疑您的控件正在反弹,但您看不到任何更改,因为您正在覆盖已更改的按钮。在您的代码中设置一些断点或记录消息(尽管不要将 response.write 与 ASP.Net AJAX 一起使用 - 它会破坏异步回发中的内容)并查看实际发生的情况。是否正在执行 bind() 方法?

【讨论】:

  • 我正在更改数据源。在绑定中,我检查一个布尔字段:如果它是真的,我设置一个特定的图标。否则,我设置另一个图标。
  • 好的...你在调试器中检查了吗?您确定数据源实际上正在更新吗?
  • 是的。我现在无法调试,因为我需要一些防火墙规则来远程调试共享点服务器,但是我在单击项目按钮后测试了绑定到一个空列表,瞧,列表是空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多