【问题标题】:Keep controls persistent when the querystring changes当查询字符串更改时保持控件持久
【发布时间】:2009-03-05 04:19:37
【问题描述】:

有没有办法使用新的查询字符串进行回发,不会将页面上的所有控件重置为默认值?我有一个名为“default.aspx”的页面,上面有几个复选框控件。我可以根据需要检查它们,并且它们将在回发到“default.aspx”时保持持久性(意味着它们保持选中或未选中状态)。但是,如果我回发到“default.aspx?page=2”,所有控件都会恢复到它们的默认状态。有没有办法阻止他们这样做?

【问题讨论】:

    标签: c# persistence postback query-string


    【解决方案1】:

    这里要记住的是,每次进行新的回发时,您都在使用页面类的全新实例。旧实例在发送到 Web 浏览器的那一刻就被丢弃了。考虑到这一点,状态可以在回发之间持续存在的事实非常惊人。有很多事情要做才能让一切正常同步。

    其中之一就是 ViewState。 ViewState 是页面表单中一个特殊的隐藏输入元素。当您使用新的查询字符串请求您的页面时,您不再从表单中发布该视图状态字段。您根本不再真正进行回发:这是对全新页面的请求。没有来自任何表单的 POST 数据,因此缺少 ViewState 数据,并且 ASP.Net 不知道您之前可能做过的任何事情。

    【讨论】:

    • 我总是看到有“第 2 页”链接的页面,并在不重置文本框或复选框的情况下发回给自己。我想我可以在一个文本文件中写入一些内容,并在下次页面加载时读取该文本文件,但我不敢相信它实际上是这样完成的。
    • 如果它们实际上是“回发”,那么它们就是表单提交,并且查询字符串不能更改。没有什么能阻止您以这种方式开发页面,但您将负责补偿 PostBacks 的损失。
    • 你的意思是我应该使用 POST 方法而不是 GET 方法?我可以这样做,只是我没有表格。我期待 ASP.NET 控件取代对表单的需求。也许我应该用 Pearl 或 PHP 来写这个。我肯定还没有在 .NET 上出售。
    • 不,我不是说要使用 post 方法。 asp.net 中的 PostBack 是一个非常具体的术语。这个答案解释了 asp.net 页面状态是通过 ViewState/PostBack 模型保持的,该模型与更改查询字符串是互斥的。
    【解决方案2】:

    当您更改查询字符串时,您是如何回发的?如果您使用的是 ASP.net 复选框控件(使用 runat="server"),那么它们应该与视图状态保持一致。

    Joel 说创建了 Page 类的新实例是正确的,但这是 Viewstate 的目的,它克服了 HTTP 的无状态特性。

    【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签