【问题标题】:while doing Response.Redirect on same page my ViewState get Cleared在同一页面上执行 Response.Redirect 时,我的 ViewState 被清除
【发布时间】:2017-12-01 05:22:22
【问题描述】:

当我通过 Response.Redirect 将页面重定向到具有不同查询字符串的相同 URL(到同一页面)时,我的视图状态被清除。

请为我提供在某处维护存储数据的视图状态数据的想法或替代方法,以便在同一页面上的 Response.Redirect 之后我可以获得该值 (仅适用于该页面,不适用于新标签)

会话将通过所有选项卡和页面为我提供数据 我希望它只在 response.redirect 之后才显示一页。

【问题讨论】:

  • Postback 和 Response.Redirect 到同一个 URL(到同一个页面)有区别
  • Response.Redirect 和第一次去页面一样。您的选择可能是提出Response.Redirect 的替代方案,使用回发来维护 ViewState。 Server.Transfer 也可能是另一种选择。我不会试图将 ViewState 作为一个整体来维护,它太复杂了,而且从设计上来说,很难操作。我们真的没有足够的信息来说明您要做什么,无法提供有意义的答案
  • 我开发了纯动态页面。所有控件和值都是根据用户输入填充的,因此对于每个输入,我将页面重定向到相同的 URL,但通过 Request.QueryString 使用不同的查询字符串,因此我将数据存储在 ViewState 中(会话是不可能的,因为它会产生问题如果同一页面被多次打开),所以当我使用 response.redirect 重定向时,我的视图状态会被清除,所以我想要可以在 response.redirect 之后维护数据但仅适用于该页面的解决方案
  • Session 是一个可行的选择。每个页面实例都可以有一个 GUID 标识符,这是您的会话密钥,然后可以在查询字符串中或作为隐藏的表单变量传递此 guid。我仍然认为 Server.Transfer 可以工作。
  • 但我认为 GUID 标识符只有在回发发生时才有效一次,而不是页面生成新的 guid,所以我如何验证该 guid

标签: c# asp.net vb.net


【解决方案1】:

显然Response.RedirectPostBack 是两个不同的东西。 Response.Redirect 清除所有ViewState 参数。如果您不愿意在会话中保存值,我建议您在QuerystringPageLoad 中发送Viewstate 数据,检查Request.Querystring 的该值是否不为空,如果不是,则保存该值再次进入Viewstate

protected void Page_Load(object sender, EventArgs e)
{
    if(!isPostBack)
    {
          if(Request.QueryString["id"] != null)
          {
                  ViewState["id"]=Request.QueryString["id"];
          }
    }
}

【讨论】:

  • 实际上我将标志存储在视图状态中,告诉我页面仅第一次打开并且页面是纯动态的,所以我必须通过 response.redirect 使用不同的查询字符串再次将页面重定向到相同的 URL我想检查同一用户是否无法再次打开同一页面,如果用户直接复制并过去 url 字符串,并且如果我们在查询字符串中维护该数据,则系统允许用户再次打开该页面,因为它通过查询字符串获得正确的标志我不想要的
【解决方案2】:

Response.Redirect 将清除 ViewState,无论重定向到相同或不同页面。 如果您需要保留 ViewState,请使用 Ajax 机制使用部分回发。 如果您想使用 Response.Redirect 保留 ViewState,请检索 viewstate 并使用会话或查询字符串将其带到重定向页面。

【讨论】:

  • 所有控件都是动态创建的,所以 Ajax 机制对我不起作用,页面是纯动态的,所以我必须通过 response.redirect 使用不同的查询字符串再次将页面重定向到相同的 URL 实际上我将标志存储在viewstate 告诉我页面是第一次打开的再次该页面,因为它通过查询字符串获得正确的标志,我不希望会话也创建相同的问题
  • 如果是这种情况,请使用查询字符串作为标志。不要使用 ViewState。确保您进行了一些加密或用户无法读取的操作。例如。 blurblur.com?f=vCxcC53W5JHJ7aXjUdDud272e8dd39。或者,使用数据库来跟踪第一次与否。
  • 用户只需通过右键单击标签来复制标签
  • 没关系。检查页面加载
  • 用户只需通过右键单击选项卡来制作重复选项卡,在这种情况下,当新页面以加密格式加载但当我解密它时,我将得到相同的值,我在第一次打开页面时输入多次在数据库中并将其存储在视图状态中,但问题是我的页面是动态的,因此它多次重定向到同一个 url,所以当重定向发生在同一页面上时,它会检查数据库中的条目并找到该页面的条目,所以我编写代码如果我在数据库中找到一个条目,则在这种情况下关闭该页面,页面不能关闭,因为它被重定向,不会再次新打开
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2011-08-11
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多