【问题标题】:ASP.NET ViewState postback with page refresh and bookmarks带有页面刷新和书签的 ASP.NET ViewState 回发
【发布时间】:2010-09-25 21:43:09
【问题描述】:

ASP.NET ViewState 功能有时是一把双刃剑。我的大部分项目都依赖它,它大大加快了开发速度。

我的问题是,有时用户会尝试刷新页面,这会导致视图状态丢失,其他时候用户可能想要为页面添加书签,但当返回时视图状态将丢失。

当用户尝试刷新页面时,现代浏览器会显示一个愚蠢的对话框,该页面是根本不希望的 POST 操作(例如 asp 回发)的结果。

我想知道他们是否可以继续使用 ViewState 和回发模型,但没有刷新对话框的缺点。 (如果可能的话,为页面添加书签。)

我可能想要做的一个例子是在页面旁边有一个记录和复选框,用户可以选择检查他们想要删除的所有记录,然后单击删除按钮。用户单击删除后,记录在服务器上进行分析,新页面列出所有使用确认删除按钮选择的记录。现在,如果用户单击刷新,他们会得到这个愚蠢的框来确认他们是否要发布。

我知道 ViewState 是使用 Post Back 模型的结果,这意味着大多数 asp.net 页面都是 POST 操作的结果,但我想知道是否有任何解决方法。

我认为可能可行的解决方法:
在 Page_Unload 事件中,使用唯一 id 将视图状态保存在会话中,并将用户重定向到具有唯一 id 作为查询字符串参数的同一页面,在页面使用 url 中的唯一 id 加载后,从会话中加载视图状态并注入到当前页面。这样的方法将允许用户刷新页面并始终返回相同的结果。

附: 我知道我可以使用Response.Redirect() 和/或查询字符串,但我想使用ViewState 的简单性

【问题讨论】:

    标签: .net asp.net post postback viewstate


    【解决方案1】:

    我的 2 美分:不要使用 ViewState 沙袋的简单性,而是使用 Session 的简单性 - 这确实是同样的简单性,您不必担心关于页面刷新和东西。 此外,会话更加灵活,因为您可以使用它来存储不仅仅是内置类型而不会影响性能(您也可以使用 ViewState 来存储,但会影响性能)。

    【讨论】:

      【解决方案2】:

      我将在这里一次发表我的意见。

      对话会警告您重复发帖这一事实是 IMO 的一件好事。如果它是一个结帐页面并且重新提交会以某种方式最终重新向用户的信用卡收费怎么办。我同意对话中的措辞可能会更好,但我们就是我们现在的位置。

      如果您考虑书签行为,这意味着我会想一次又一次地重新访问该页面,但我的会话很可能在此之前就已经结束了。因此,您可以将视图状态保存到 GUID,但随后您可能必须将该视图状态永久保存在数据库中。如果页面同时发生变化怎么办?该视图状态现在将无效。

      在您的情况下,您肯定需要一个查询字符串参数,该参数将从数据库中加载您的用户数据并在 page_load 期间正常填充页面? www.my-site.com/Customer.aspx?Id=90401 或类似的东西。

      我的建议是不要与工具抗争。希望这会有所帮助。

      【讨论】:

      • +1 表示“我的建议是不要与工具作斗争”。如果该工具不适合这项工作,请找到适合的工具
      【解决方案3】:

      @Asaf - 我没有否决你的答案,但这里有几个原因:

      1) 不能在查询字符串中存储复杂类型 2)查询字符串在IE中被限制在2Kb左右,不是很多 3) 误用 GET 方法 - GET 字面意思是“获取”数据(例如 google 的搜索栏),而 POST 是用于“发布”数据到服务器以操作服务器上的数据(例如联系表单) . 4) 任何依赖 Page.IsPostBack 的东西都会停止工作。

      【讨论】:

        【解决方案4】:

        这可能不是一个优雅的解决方案,但我认为如果您将表单方法更改为 GET,它可以解决您的书签问题和刷新问题。

        它与使用查询字符串相同,但 VIEWSTATE 的抽象保持不变。

        【讨论】:

        • 非常欢迎投反对票的人提供原因。也许我们都会学到一些新东西。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 2010-10-07
        相关资源
        最近更新 更多