邮寄后,UpdatePanel和Repeater呈现页面无响应

时间:2010-02-01 18:12:34

标签: c# asp.net updatepanel postback repeater

我有一个带有UpdatePanel的页面,其中包含一个Repeater和一个文本框,其中包含转发器中的项目数。当我更改值时,页面应该回发并使用更新的项目数重绘重复器。这在原则上是有效的,但页面在回发后结束并且不接受任何输入 - 仅在IE 8中。它在Firefox中运行得非常好。例如,当我右键单击控件时,不会出现上下文菜单,我无法在文本框中输入文本。

当我取出UpdatePanel时,页面工作正常,但当然每次回发事件都会刷新。这不一定与页面上的Repeater有关。我想我在其他页面上看到了这一点。这里的诀窍是什么?

<asp:UpdatePanel ID="uPanel" runat="server" UpdateMode="Conditional" 
  EnableViewState="true" ChildrenAsTriggers="true">
  <ContentTemplate>
  <asp:Panel ID="Panel1" runat="server" DefaultButton="btnSubmit">
    <asp:TextBox ID="tbItems" runat="server" AutoPostback="true" 
                      OnTextChanged="textchanged_Items"/>                     
  <asp:Repeater id="rptItems" runat="server" 
           OnItemDataBound="repeaterItem_Databound">
        <...>
      </asp:Repeater>


    protected void textchanged_Items(object sender, EventArgs e) {
        try {
            // this methods rebinds the repeater to a List after changing
            // the number of items in the list
            ReflowItemRepeater();   
            // This is not really necessary, since Databind() appears to
            // cause an update. I tried it anyways.               
            uPanel.Update();
        }
        catch (Exception ex) {
            ShowError(this, "Error displaying the item list.", ex, true);
        }
    }

我最终删除了更新面板。

一个月之后,不同的页面,我仍然在为此而斗争。情况是一样的。 更新面板,转发器(实际上是2个嵌套转发器),以及转发器中用于触发回发事件的控件。服务器正确处理事件并返回控制权,但浏览器(IE8)永远不会刷新更新面板。页面没有响应,好像处于某种死锁状态。我可以通过单击触发另一个回发事件的按钮(也在更新面板中)来解锁它。但是,当发生这种情况时,面板中的文本框不可单击或可编辑。 而且,它只是第一次发生。一旦我“释放”了锁或其他任何东西,它就不会再发生在这个页面上,即使我重复了导致它的完全相同的步骤。

发生这种情况时,JIT调试器不会报告任何内容。

4 个答案:

答案 0 :(得分:1)

我实际上会在您的更新面板中设置触发器。

我不确定您是否需要在代码中调用.Update,因为更新面板将在触发器发生时更新。

试试这个:

    

答案 1 :(得分:0)

我的直觉是它与使用OnTextChanged事件有关。对于踢,请尝试在文本框旁边添加一个按钮,然后在单击按钮时重排转发器。 IE仍然会冻结吗?

答案 2 :(得分:0)

所以我把这个页面剥离到最低限度,我发现了它正在做什么 - AjaxToolkit:CalendarExtender。如果我拿出来,一切正常。不过,我很想知道是否有解决方法。

这是link to my test page。我会保持几天。

要查看问题,请从下拉列表中选择“2”,然后在第一个数量字段中输入内容并标签输出。光标将在下一个字段中闪烁,但不允许输入。这发生在IE8中,而不是在Firefox中。

编辑:实际上,当我回到整页并删除CalendarExtender时,它仍然无法正常工作。我怀疑这个问题与在UpdatePanel中发布的控件有关,但我无法将其固定下来。看起来似乎是x事物组合不起作用的事情之一,而(x-1)事物的任何组合都有效。

答案 3 :(得分:0)

关于最初的问题,这是一个工作样本。我不知道它是否有用,但只是为了确保......

<%@ Page Language="C#" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server"><title>Ajax Test</title></head>
  <body>
    <form id="form1" runat="server">
<asp:ScriptManager runat="server" />

<asp:UpdatePanel runat="server" ChildrenAsTriggers="true">
  <ContentTemplate>
    <asp:Label runat="server" AssociatedControlID="txtTest">
       Enter 'fruit' or 'vegetables':
    </asp:Label>
    <asp:TextBox
      runat="server" ID="txtTest" AutoPostBack="true"
      OnTextChanged="Handler_Test_TextChanged"
    />

    <asp:Repeater runat="server" ID="rptItems">
      <HeaderTemplate><ul></HeaderTemplate>
      <ItemTemplate><li><%# Container.DataItem.ToString() %></li></ItemTemplate>
      <FooterTemplate></ul></FooterTemplate>
    </asp:Repeater>
  </ContentTemplate>
</asp:UpdatePanel>
    </form>
  </body>
</html>

<script runat="server">
  static readonly string[] Fruit = new string[]
    { "Apples", "Oranges", "Bananas", "Pears" };

  static readonly string[] Veg = new string[]
    { "Potatoes", "Carrots", "Tomatoes", "Onion" };

  void Handler_Test_TextChanged(object s, EventArgs e)
  {
    if(txtTest.Text == "fruit")            rptItems.DataSource = Fruit;
    else if(txtTest.Text == "vegetables")  rptItems.DataSource = Veg;
    else                                   return;
    rptItems.DataBind();
  }
</script>