在UpdatePanel中刷新时ViewState丢失了吗?

时间:2009-12-16 15:16:45

标签: asp.net updatepanel viewstate

我正在存储我需要持久保存到自定义ViewState变量的临时变量,而不是使用Session对象或存储到数据库。例如,ViewState(“MyField1”)= 1

当用户点击浏览器Rrefresh按钮时,Page.IsPostback返回False并且ViewState消失。

我的问题是。如果用户可以通过刷新来吹走Viewstate,为什么有人会使用它?

我知道刷新会重新发布最后提交的页面,为什么Page.IsPostback会重置为False并且ViewState会被吹走?

如果你想创建一个潜在的重复问题,请点击我,但我已经在这里阅读了其他帖子,并且它没有下沉...

更新到原始帖子:

我现在认为它与由于点击UpdatePanel中的按钮而执行的回发有关。有人可以帮助解释一下吗?

5 个答案:

答案 0 :(得分:4)

当客户端刷新其浏览器时,它会重新提交客户端发出的最后一个完整页面请求(可能是GET or a POST)。它不会重新提交AJAX请求,例如由更新面板事件触发器生成的请求(“部分页面回发”)。

当您刷新页面时Page.IsPostbackfalse这一事实意味着您的原始请求是GET,所以这是可能发生的事情:

1)在初始请求期间,客户端不向服务器发送任何表单数据 - 因此没有包含视图状态数据的隐藏字段(Understanding ASP.NET View State非常详细,但如果您想真正理解将要发生的事情,那么这是一个很好的读取上)。在处理此请求时,ASP.NET可能会将一些视图状态发送回客户端,但原始请求只是一个URL。

2)当用户单击UpdatePanel中的按钮时,它们会触发部分回发,在此期间MyField设置为1. UpdatePanel会更改客户端的视图状态以反映新值。

此时,如果用户通过常规方式提交POST请求,例如单击按钮,则视图状态将包含更新的信息。

如果用户点击“刷新”,他们会重新提交步骤1中的原始请求,没有表单数据,因此没有视图状态。

答案 1 :(得分:1)

您在哪里设置ViewState?你在哪里重读你的ViewState值?也许oyu在asp.net调用LoadViewState()方法之前检查它的内容。

答案 2 :(得分:0)

用户点击刷新并使用updatepanel将无法很好地协同工作。我觉得这就是为什么人们说WebForms在Web编程上提供了漏洞,有些人正在转向mvc。

如果您对迁移不感兴趣,我会向您提供不使用updatepanel太长时间或大型操作的建议,您可以假设用户可能刷新页面。当dropdown1上的选择发生变化时,可以将它用于dropdown2项目等小事。

如果您只依赖于viewstate,则在一个updatepanel中包含大量功能会带来麻烦。

答案 3 :(得分:0)

你的问题是,“为什么有人会使用它。”

Viewstate对于您知道由回发生成的数据派上用场。点击刷新不是回复,而是一个新的请求。

因此,假设您正在浏览数据网格,并且您需要知道有关他们所点击内容的某些数据,在点击事件中您可以将该数据存储在视图状态中并在页面生命周期的其他时间处理它,或随后的帖子。

ViewState的优点是它只是嵌入到HTML中,所以它都是客户端。 SessionState是服务器端,如果在会话中存储大量数据,则可能导致Web或db服务器更难以处理该数据。

希望这会有所帮助。

答案 4 :(得分:0)

不知道它为什么会起作用,但是我有一个类似的问题并通过将这一行放在form_load中来解决它:

me.myProperty = me.myProperty

,其中

Public Property myProperty() as String
Get
  If Not IsNothing(ViewState("data")) Then
    Return CType(ViewState("data"), String)
  Else
    Return String.Empty
  End If
End Get
Set(value As String)
  ViewState("data") = value
End Set