4

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

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

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

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

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

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

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

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

4

4 回答 4

2

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

于 2008-12-10T14:55:06.153 回答
1

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

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

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

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

我的建议是不要与工具作斗争。希望这可以帮助。

于 2008-12-09T10:02:17.070 回答
1

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

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

于 2011-01-01T01:01:57.597 回答
-1

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

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

于 2009-01-21T13:18:02.970 回答