【问题标题】:HTML Tags don't change on AsyncPostBackHTML 标签在 AsyncPostBack 上不会改变
【发布时间】:2009-11-21 13:53:07
【问题描述】:

要重新生成问题,请在VS中创建一个项目,代码如下:

这个代码在MasterPage的form标签里面,后面的代码什么都没有。

<asp:ScriptManager ID="scmManager" runat="server" AsyncPostBackTimeout="3600" />
<div>
    <div id="divCContents">
        <div id="divSideBar">
            <asp:contentplaceholder ID="cphMenus" runat="server" /> 
        </div>
        <div id="divMContents">
            <asp:contentplaceholder ID="cphPages" runat="server" />
        </div>
    </div>
</div>

第一个asp里面的这段代码:TESTDefault.aspx中的内容

<asp:UpdatePanel ID="updCombos" runat="server">
    <ContentTemplate>
        <asp:DropDownList ID="DropDownList1" runat="server" Width="170px" AutoPostBack="true" 
                  OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
        </asp:DropDownList>
        <br />
        <br />
        <asp:DropDownList ID="DropDownList2" runat="server" Width="170px" AutoPostBack="true"
                          OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged">
        </asp:DropDownList>
    </ContentTemplate>
</asp:UpdatePanel>

第二个asp里面的这段代码:TESTDefault.aspx中的内容

<asp:UpdatePanel ID="updPanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Panel ID="pnlTest" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

最后一个代码在 TESTDefault.aspx.cs 中

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        subInitiateFirstCombo();
    }
}

protected void subInitiateFirstCombo()
{
    for (int xI = 0; xI < 5; xI++)
    {
        ListItem itmlist = new ListItem();

        itmlist.Value = String.Format("Dep{0}", Convert.ToString(xI));
        itmlist.Text = String.Format("Department{0}", Convert.ToString(xI));
        DropDownList1.Items.Add(itmlist);
    }
    DropDownList1.SelectedIndex = 0;
    subInitiateSecondCombo();
}

protected void subInitiateSecondCombo()
{
    DropDownList2.Items.Clear();
    for (int xI = 0; xI < 5; xI++)
    {
        ListItem itmlist = new ListItem();

        itmlist.Value = String.Format("{0}_Ind{1}", (string)DropDownList1.SelectedItem.Value, Convert.ToString(xI));
        itmlist.Text = String.Format("{0}_Indicator{1}", (string)DropDownList1.SelectedItem.Text, Convert.ToString(xI));
        DropDownList2.Items.Add(itmlist);
    }
    DropDownList2.SelectedIndex = 0;
    CreateNewTable();
}

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
    subInitiateSecondCombo();
}

protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
{
    CreateNewTable();
}

protected void CreateNewTable()
{
    int intCellCount = DropDownList1.SelectedIndex + 2;

    pnlTest.Controls.Clear();
    updPanel.Update();
    using (Table tblTest = new Table())
    {
        tblTest.ID = (string)DropDownList2.SelectedItem.Value;
        tblTest.Attributes.Add("style", "border-collapse: collapse; margin-top: 100px;");

        for (int xI = 0; xI < 3; xI++)
        {
            using (TableRow tbrRow = new TableRow())
            {
                tbrRow.ID = String.Format("tbrRow{0}", Convert.ToString(xI));

                for (int xJ = 0; xJ < intCellCount; xJ++)
                {
                    using (TableCell tbcCell = new TableCell())
                    {
                        tbcCell.ID = String.Format("{0}_tbcCell{1}", tbrRow.ID, Convert.ToString(xJ));
                        tbcCell.Attributes.Add("style", String.Format("border: #808080 1px solid; " +
                                                                       "font-family: Verdana; " +
                                                                       "font-size: 8pt; " +
                                                                       "color: #3b5998; " +
                                                                       "text-align: center; " +
                                                                       "vertical-align: middle;"));
                        tbcCell.Width = Unit.Pixel(100);
                        tbcCell.Height = Unit.Pixel(80);
                        tbcCell.Text = String.Format("{0}", tblTest.ID);

                        tbrRow.Controls.Add(tbcCell);
                    }
                }
                tblTest.Controls.Add(tbrRow);
            }
        }
        pnlTest.Controls.Add(tblTest);
        updPanel.Update();
    }
}

运行页面并查看源代码后,您将看到动态生成的表格的标签。现在从 DropDownLists 中选择另一个选项来重新生成不同的表格,然后再次查看源代码,您会发现旧表格标签仍然存在,并且没有新表格的迹象(尽管它显示在屏幕上)。

我发现它正常工作的唯一方法是强制一个完整的 PostBack。还有其他方法吗?我需要它的原因是一些 javascripts 将运行并且它需要获取表 ID。

希望我的例子很清楚。任何提示将不胜感激。

干杯。

【问题讨论】:

  • 查看源代码不一定显示页面,因为它存在于内存中。使用 JavaScript 或 DOM 调试工具检查是否进行了更改。

标签: c# asp.net html


【解决方案1】:

JavaScript 应该能够正常访问新的 HTML。查看源代码不会与 JavaScript 对 HTML 所做的更改保持同步(如 AJAX 回发)。

如果您想即时查看此类更改,那么Firebug 将允许您在 Firefox 中检查当前活动的 DOM。

【讨论】:

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