【问题标题】:Keep value after postback回发后保持价值
【发布时间】:2012-04-04 20:28:15
【问题描述】:

我有一个类似于以下代码的 ASP.NET 网站:

.aspx

<asp:UpdatePanel ID="UpdatePanel" runat="server">
    <ContentTemplate>
        <table id="RatesTable">
            <tr>
                <td>Hotel</td>
                <td>&nbsp;</td>
            </tr>
            <tr id="NewRateRow">
                <td>
                    <asp:DropDownList ID="TxtHotel" runat="server" OnSelectedIndexChanged="TxtHotel_SelectedIndexChanged" AutoPostBack="true">
                    </asp:DropDownList>
                </td>
                <td>
                    <a href="javascript:AddHotelPackRate()">Add</a>
                </td>
            </tr>
        </table>
    </ContentTemplate>
</asp:UpdatePanel>

AddHotelPackRate JS 函数,读取下拉列表中的值并在表的开头“绘制”一个包含该值的新行。 问题是,在此之后,当再次执行 SelectIndexChanged 函数时,之前添加的行现在消失了。

有没有办法避免在回发后丢失此类信息?

【问题讨论】:

  • 您应该在回发后再次添加(重新创建),这样您就可以将重新创建所需的信息保存在隐藏字段中,并在回发后读取此信息以重新创建附加行。但是,问题是在更改下拉列表中选择的项目后是否真的需要回发?这样对用户来说可能更直观,您可以避免这个问题。
  • @Lucas 我需要回发以从所选值中检索一些信息。我想过将信息保存在隐藏字段中,然后重新创建行,问题是它不只是上例中的一个单元格,最终会有数百行,我绝对不想访问添加每一行后的db..但我想没有其他解决方案

标签: c# javascript asp.net


【解决方案1】:

您要么必须让 JS 在更新面板中添加内容,要么您需要添加 JS 代码在回发中添加的任何数据,以便在重新绘制数据时它继续存在。

简单的方法可能只是让AddHotelPackRate 导致更新面板更新,通过服务器端代码以及任何其他数据库/等添加行。变化,使其继续存在。

编辑:另一条评论还提出了这样一个事实,即当所选项目更改时您无法更新更新面板,从而完全避免了该问题(以不同的方式)。

【讨论】:

  • 需要回发,因为我需要从所选值中检索信息,因此我可以填充行中的其他下拉列表。我期待在创建每一行后避免访问数据库,但我想没有其他选择。谢谢!
  • 我一开始没有添加它,因为我只是假设它存在是有正当理由的,但经过健全性检查它确实应该存在,这对未来的读者有好处。
【解决方案2】:

问题是您没有在更新面板中添加触发器。 将您的代码更改为:

<asp:UpdatePanel ID="UpdatePanel" runat="server">
<ContentTemplate>
    <table id="RatesTable">
        <tr>
            <td>Hotel</td>
            <td>&nbsp;</td>
        </tr>
        <tr id="NewRateRow">
            <td>
                <asp:DropDownList ID="TxtHotel" runat="server" OnSelectedIndexChanged="TxtHotel_SelectedIndexChanged" AutoPostBack="true">
                </asp:DropDownList>
            </td>
            <td>
                <a href="javascript:AddHotelPackRate()">Add</a>
            </td>
        </tr>
    </table>
</ContentTemplate>
<Triggers>
   <asp:AsyncPostBackTrigger ControlID="TxtHotel" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>

【讨论】:

  • 问题是updatepanel更新重写了updatepanel的全部内容,服务器不知道javascript的变化,所以不持久。问题不在于他有完整的回发。
  • @Servy - 据我了解,问题是当执行 selectedindexChanged 并将 autopostback 设置为 true 时会进行回发,然后清空当前创建的行。也许我理解错了。
  • 问题不在于整页回发,回发正确地进入了更新面板并完成了整个 AJAX 操作。问题是 UpdatePanels 更新数据的方式给他带来了问题。您的代码将与 OP 中的代码完全相同;问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2013-02-08
  • 1970-01-01
  • 2011-01-10
相关资源
最近更新 更多