带有页面刷新和书签的ASP.NET ViewState回发

时间:2008-12-08 17:59:14

标签: .net asp.net post postback viewstate

ASP.NET ViewState功能有时可能是一把双刃剑。我在大多数项目中依赖它,它大大加快了开发速度。

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

当用户尝试刷新由POST操作(例如asp回发)导致的页面时,现代浏览器将显示一个愚蠢的对话框。

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我会一次一个地给出我的意见。

对话警告你关于重复发帖的事实是IMO的一件好事。如果它是一个结账页面并且重新提交将以某种方式最终再次向用户的信用卡重新收费。我同意对话的措辞可能更好,但我们就在这里。

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

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

我的建议是不打击工具。希望这会有所帮助。

答案 2 :(得分:1)

@Asaf - 我没有对你的回答进行投票,但这里有几个原因:

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

答案 3 :(得分:-1)

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

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