【问题标题】:Can I change the browser URL while maintaining ViewState in ASP.NET?我可以在 ASP.NET 中维护 ViewState 的同时更改浏览器 URL 吗?
【发布时间】:2009-11-17 16:14:58
【问题描述】:

我正在为门户框架进行一些头脑风暴,我正在设想一个通过 ViewState 跟踪的面包屑导航堆栈(这样如果用户在浏览器中单击“返回”并单击其他链接,面包屑导航踪迹将离开正确的页面)。我的页面实际上只是 ascx 控件,它们根据 URL 加载到主门户页面上的占位符控件中。当用户点击一个门户链接时,会有一个回发加载原始页面并调用给定链接的“点击”处理程序,然后它应该在向浏览器发送重定向指令以更改之前将当前位置“推送”到面包屑堆栈上我要访问的页面的 URL。

目前我的头脑风暴就是这样,因为一旦我们执行重定向,我们就会失去 ViewState。我没有进行重定向,而是简单地告诉我的主门户页面将当前页面控件替换为目标页面控件,从而避免额外的 http 往返并允许我保留 ViewState。但是后来我的整个网站体验都发生在单个 URL 的上下文中,因此我丢失了 URL 书签等。如果我将一些控件封装在 AJAX 面板中,就浏览器的历史记录而言,整个网站都会发生在一个页面请求中。

我想要的是某种方式让浏览历史记录和 URL 表现得好像每个链接都将它们引导到一个带有描述性 URL 的新页面等等,但仍然有一些方法可以知道用户采取的路径到达他们所在的页面(ViewState 似乎是跟踪这一点的最简单方法)。

谁能推荐一些我可以尝试使用的技术?

【问题讨论】:

    标签: asp.net viewstate


    【解决方案1】:

    第一个建议...您可能想研究 ASP.NET MVC。但是,我不得不承认这里有些无知,因为我不确定这是否真的能解决你的问题。但它听起来就像 MVC 适合的那种东西。

    其次...可以重写负责保存和加载 ViewState 的方法。例如,您可以做的一件事是将 ViewState 推送到 Session 中,而不是将其发送给用户并在回发时备份。您可以在此处轻松添加一些自定义代码。

    第三...我认为您可能需要重新考虑您的设计的一部分。 ViewState 确实有一个目的:它重新创建页面在为用户呈现页面时存在的状态。如果你要移动到不同的页面,或者一组新的控件,你为什么需要 ViewState 呢? ViewState 本身实际上只是一个hack 开始... ASP.NET 在无状态系统之上维护状态的方式。 (但这是一个完整的“另一个讨论”)我们还有其他维护状态的方法......主要机制是 Session 对象。为什么不将您的 breaacrumb 数据保存在那里?

    【讨论】:

    • "(因此,如果用户在浏览器中单击“返回”并单击其他链接,则面包屑路径将离开右侧页面)。在无状态系统之上维护状态正是我想要的。假设您在新选项卡中打开一个链接,沿着该路径向下几个链接,然后返回到上一个选项卡并从那里开始浏览。将这些数据完全存储在会话中会产生像这种合并面包屑这样的场景,这是不可取的。
    【解决方案2】:

    我会考虑使用 cookie。出于性能原因,您确实希望尽可能避免 HTTP 重定向,并且 ViewState 仅在用户提交表单时才有效,而不适用于常规链接。

    您可能会做一些事情,例如在 cookie 中维护多个路径列表,以显示用户从一个页面到另一个页面所采用的路径。也许您为每个页面设置了一个唯一的 ID,当用户单击链接时,某些 JavaScript 应用该 ID 作为查询字符串,服务器使用该 ID 和 cookie 中的过去历史记录来确定如何在下一页?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2016-01-07
      相关资源
      最近更新 更多