2008-12-08 65 views
4

ASP.NET ViewState功能有时可能是一把双刃剑。我在大部分项目中都依赖它,并大大加快了开发速度。带有页面刷新和书签的ASP.NET ViewState回发

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

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

我不知道是他们的方式继续使用ViewState和回发模型,但没有刷新对话框的缺点。 (并且如果可能的话,将书签标记在页面上。)

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

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

解决办法,我认为可能的工作:
在激发Page_Unload事件保存在会话视图状态一个唯一的ID和用户提供唯一的ID作为查询字符串参数重定向到同一页面,在页面加载与后视图状态从会话中加载并注入到当前页面中的唯一标识。这样的方法将允许用户刷新页面并始终返回相同的结果。

P.S. 我明白,我可以使用Response.Redirect()和/或查询字符串,但是我想使用的ViewState

回答

1

简单,我给我的意见在这里一次一个。

事实上,对话警告你关于重复发布是一件好事IMO。如果是结账页面并且重新提交将以某种方式结束再次对用户的信用卡进行重新计费,该怎么办?我同意在对话上的措辞可能会更好,但我们现在处于我们的位置。

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

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

我的建议是不打工具。希望这可以帮助。

+0

+1“我的建议是不要打工具”。如果该工具不适合工作,找到一个是 – Dean 2012-12-21 05:24:48

2

我的2美分:不要使用ViewState的沙袋的简单使用会议的简单 - 这实际上是相同的简单,你将不必理会担心页面刷新和东西。 此外,会话方式更灵活,因为您可以使用它来存储不仅仅是内置类型而不影响性能(您也可以使用ViewState来完成此操作,但会影响性能)。

-1

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

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

+0

谁投了票谁是不止欢迎说出原因。也许我们都会学到新的东西。 – 2010-04-02 10:03:29

1

@Asaf - 我没有反对票你的答案,但这里有几个原因:

1)不能复杂类型存储在查询字符串 2)查询字符串以限制在约2K位IE,这不是很多 3)错误使用GET方法 - GET实际上是用于“获取”数据(例如google的搜索栏),POST是用于将数据“发布”到服务器以便处理数据服务器(如联系表格)。 4)任何依靠Page.IsPostBack的东西都会停止工作。