使用 ASP.NET AJAX 和更新面板时如何处理视图状态的想法

2024-02-21

这是我编写的一个类,用于解决我在视图状态方面遇到的一些问题。它将信息存储在用户会话中并增加一个值来跟踪要显示的状态。困难在于不支持后退按钮。我最初这样做的原因是,在 AJAX 出现之前,视图状态被发送到客户端而不是存储在服务器上。我认为通过将其存储在服务器上,我可以使客户端体验更加丰富。现在,通过像速度这样的项目进行分布式缓存,可以将其存储在缓存中。

我很想听听人们可能有的一些评论和任何建议。

Public Class ViewState
    ''' <summary>
    ''' Saves the state to the users session
    ''' </summary>
    ''' <param name="viewState">The viewstate object to serialize</param>
    ''' <param name="NoSerialize"></param>
    ''' <returns>Returns the KEY of the string that was saved.</returns>
    ''' <remarks></remarks>
    Function SaveState(ByVal viewState As Object, Optional ByVal NoSerialize As Boolean = False)
        HttpContext.Current.Session("VSID") = HttpContext.Current.Session("VSID") + 1
        If NoSerialize Then
            HttpContext.Current.Session(CacheString) = viewState
        Else
            Dim Format As New LosFormatter
            Dim Writer As New System.IO.StringWriter
            Format.Serialize(Writer, viewState)
            HttpContext.Current.Session(CacheString) = Writer.ToString
        End If
        Return HttpContext.Current.Session("VSID")
    End Function
    ''' <summary>
    ''' Returns a deserialized copy of the viewstate object
    ''' </summary>
    ''' <param name="SQLSTATE"></param>
    ''' <param name="NoSerialize"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function LoadState(ByVal SQLSTATE, Optional ByVal NoSerialize = False) As Object
        If NoSerialize Then
            If Not HttpContext.Current.Session(CacheString(SQLSTATE)) Is Nothing Then
                Return HttpContext.Current.Session(CacheString(SQLSTATE))
            Else
                HttpContext.Current.Trace.Warn("No ViewState Object Found")
            End If
        Else
            Dim Format As New LosFormatter
            If Not HttpContext.Current.Session(CacheString(SQLSTATE)) Is Nothing Then
                Return Format.Deserialize(HttpContext.Current.Session(CacheString(SQLSTATE)))
            Else
                HttpContext.Current.Trace.Warn("No ViewState Object Found")
            End If
        End If
    End Function
    ''' <summary>
    ''' AJAX Viewstate
    ''' Saves the state to the users session
    ''' </summary>
    ''' <param name="viewState">The viewstate object to serialize</param>
    ''' <param name="VSID">The ID that the page uses to find the viewstate item</param>
    ''' <param name="NoSerialize"></param>
    ''' <returns>Returns the KEY of the string that was saved.</returns>
    ''' <remarks></remarks>
    Function SaveState(ByVal viewState As Object, ByVal VSID As String, Optional ByVal NoSerialize As Boolean = False)
        HttpContext.Current.Session("VSID") = HttpContext.Current.Session("VSID") + 1
        If NoSerialize Then
            If VSID = "" Then
                HttpContext.Current.Session(CacheString) = viewState
                Return HttpContext.Current.Session("VSID")
            Else
                HttpContext.Current.Session("VSID") = HttpContext.Current.Session("VSID") + 1
                HttpContext.Current.Session(CacheString) = viewState
                HttpContext.Current.Session(CacheString(VSID)) = viewState
                Return HttpContext.Current.Session("VSID")
            End If
        Else
            Dim Format As New LosFormatter
            Dim Writer As New System.IO.StringWriter
            Format.Serialize(Writer, viewState)
            If VSID = "" Then
                HttpContext.Current.Session("VSID") = HttpContext.Current.Session("VSID") + 1
                HttpContext.Current.Session(CacheString) = Writer.ToString
                Return HttpContext.Current.Session("VSID")
            Else
                HttpContext.Current.Session("VSID") = HttpContext.Current.Session("VSID") + 1
                HttpContext.Current.Session(CacheString) = Writer.ToString
                HttpContext.Current.Session(CacheString(VSID)) = Writer.ToString
                Return HttpContext.Current.Session("VSID")
            End If
        End If
    End Function
    ''' <summary>
    ''' Gets the string representing the cached viewstate object.
    ''' </summary>
    ''' <param name="VSID">Use this to override the session VSID property and use your own.</param>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property CacheString(Optional ByVal VSID As Integer = 0) As String
        Get
            If VSID = 0 Then
                Return "ViewState" & HttpContext.Current.Session("VSID")
            Else
                Return "ViewState" & VSID
            End If
        End Get
    End Property
End Class

以下代码位于您的 asp.net 页面的代码后面:

Protected Overrides Sub SavePageStateToPersistenceMedium(ByVal viewState As Object)
        Dim VState As New ViewState
        If String.IsNullOrEmpty(Request.Form("__SQLVIEWSTATE")) = False Then
            RegisterHiddenField("__SQLVIEWSTATE", VState.SaveState(viewState, Request.Form("__SQLVIEWSTATE")))
        Else
            RegisterHiddenField("__SQLVIEWSTATE", VState.SaveState(viewState))
        End If
    End Sub
    Protected Overrides Function LoadPageStateFromPersistenceMedium() As Object
        Dim VState As New ViewState
        Return VState.LoadState(Request.Form("__SQLVIEWSTATE"))
    End Function

在您编写自己的代码以将视图状态保留到会话之前,您是否尝试过内置功能?

protected override PageStatePersister PageStatePersister
{
    get
    {
        return new SessionPageStatePersister(this);
    }
}

(所示为 C# 版本)。也许这可以解决您的后退按钮问题?

编辑回答评论:我认为这是 VB 的等价物:

Public Overrides Function GetStatePersister() As PageStatePersister
  Return New SessionPageStatePersister(Page)
End Function 'GetStatePersister

我不知道它如何处理后退按钮,但我相信它每页最多存储 10 个状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ASP.NET AJAX 和更新面板时如何处理视图状态的想法 的相关文章

  • 在类库项目中使用资源.resx文件

    我在类库项目中使用了资源文件 resx 文件来存储一些错误消息 当我将 resx 文件的 构建操作 设置为 嵌入资源 并部署时 它工作正常 但我想将资源文件与dll分开 因为将来我可能需要更改resx文件中的错误消息 而无需重新编译类库项目
  • 如何强制控制器/操作使用 JsonValueProvider

    再会 我正在使用 ASP NET MVC 3 其中JsonValueProvider http haacked com archive 2010 04 15 sending json to an asp net mvc action met
  • .net dropdownlist对齐文本

    我正在尝试将 net 下拉列表中的文本向右对齐 使用 CssClass 我可以在 Firefox 中将文本向右对齐 IE 不会将文本右对齐 而是左对齐 我读到 IE 6 不支持这个 这是真的 我使用的是 IE7 但我的大多数用户将使用 IE
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 尝试添加注册表项时出现未处理的异常

    当我使用以下代码时 My Computer Registry LocalMachine OpenSubKey SOFTWARE Microsoft Windows CurrentVersion Run True SetValue Appli
  • 检查 asp.net 文本框中的脚本

    我们希望阻止用户在文本框中输入 html 或 javascript 我们可以解析输入并检查尖括号 想知道是否有更好的方法来做到这一点 我发现用编码的尖括号替换尖括号可以解决大多数问题 这里有一个参考 http ha ckers org xs
  • WatiN 还是 Selenium? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我可以根据角色隐藏/显示 asp:Menu 项吗?

    我可以隐藏某些菜单项吗asp Menu基于角色的控制
  • ASP.NET 验证控件和 Javascript 确认框

    我有一个使用 NET 服务器端输入验证控件的页面 此页面还有一个 javascript 确认框 在提交表单时会触发该确认框 当前 当选择 提交 按钮时 会出现 javascript 确认框 一旦确认 就会触发 ASP NET 服务器端验证控
  • 使用 VB.NET 覆盖文本文件中的特定行

    我需要执行以下操作 更改文本文件中的行 Path c this certain path 用这条线 Path c that other newer path 这些路径的长度肯定会不同 因此我需要替换引号中的内容 或者完全擦除该行并输入一个新
  • “$(document).ready”函数的替代方案

    我在 aspx 页面中使用 fancybox 对于灯箱 文档就绪功能在此页面中不起作用 有人告诉我编写一个新的 JavaScript 代码来加载该页面中的灯箱 包括 jQuery 检查网络选项卡 确保您没有收到 404 检查控制台是否没有收
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 如何在自定义用户控件(.Net 4、Winforms)上使用项目集合编辑器?

    我创建了一个UserControl其中包含一个自定义ToolStrip Control 在使用时UserControl在整个应用程序中 ToolStrip控件不能直接访问 因为它逻辑上嵌入在UserControl 因此 要访问的项目Tool
  • 如何使用 VB.NET 以编程方式在 Richtextbox 中添加粗体文本

    我有这个代码 print text Text Patient number ds Tables patients Rows 0 Item 0 print text AppendText Environment NewLine print t
  • 以编程方式设置 aspnet:MaxHttpCollectionKeys

    在特定网站的一些管理功能中 我正在做一篇特别可怕的帖子 需要一个large要发布的数据量 为了实现这一点 我必须添加 Web config appSetting https stackoverflow com questions 88324
  • 自定义角色提供程序不实现继承的抽象成员

    我需要一些帮助在 ASP NET MVC 应用程序中实现自定义角色提供程序 问题是我遇到了几个错误 例如 MyRoleProvider does not implement inherited abstract member System
  • 如何在asp.net中异步执行两个作业

    网 我需要你的帮助请帮助我 请参阅我的代码 如果我的第一份工作完成 则退出btn ok代码隐藏并更新到 ASP NET 屏幕 但同时作业 2 必须工作 正在处理批量电子邮件 protected void btn ok object send
  • javascript 中一次仅选中一个复选框

    I have 3复选框 我只想1一次选中的复选框 下面是我的 html 小提琴 JS小提琴 https jsfiddle net n03jLhqa 我想要这个工作在IE8还请建议如何做 这个怎么样 fiddle http jsfiddle
  • 任务计划程序中的 asp.net 脚本

    我有一个小的 asp net 脚本 可以作为网页执行 http localhost myscript aspx http localhost myscript aspx 我需要这个脚本每 30 秒运行一次 我正在使用 IIS 6 0 的 W

随机推荐

  • 如何编写 fql 查询来列出特定位置的好友

    我无法在任何地方找到 fql 查询来根据我指定的位置列出我的 facebook 好友 我正在尝试在 android 中实现此 fql 查询 请有人帮助我 您正在寻找的 FQL 将是 select name current location
  • 预先填充的数据库。现在我想添加更多数据而不弄乱预先存在的数据

    我已经设置了一个应用程序 它预先填充了数据 将数据库复制到项目的存储中 使用 CoreDataBooks 示例 方法 有什么方法可以预填充核心数据吗 https stackoverflow com questions 2230354 any
  • 红宝石中的反射?

    我很好奇这是如何运作的 例如 如果我创建一个基于工厂模式的类 您可以在其中 注册 类以供以后使用 然后执行类似的操作 FactoryClass register YourClassName param param FactoryClass
  • 使用管道进行 awk 打印在 Jupyter Notebook 中无法使用 iPython

    因此 下面的命令不会在带有 iPython 的 Jupyter Notebook 中提供任何输出 IP 62 172 72 131 cat hits csv grep IP awk print 1 我尝试过双 符号和单 符号 但都不起作用
  • Twitter Bootstrap 按钮在 Firefox 和 Chrome 中奇怪地改变渲染

    我有一个问题 我试图用我自己的颜色覆盖 twitter bootstrap v 2 0 3 主按钮 并且它在 IE 中工作正常 但在 FireFox 或 Chrome 中不起作用 因此 在我的页面上 我首先链接到 bootstrap css
  • 如何将字节数组转换为字符串[重复]

    这个问题在这里已经有答案了 我创建了一个包含两个字符串的字节数组 如何将字节数组转换为字符串 var binWriter new BinaryWriter new MemoryStream binWriter Write value1 bi
  • 快速展开的解决方法

    那么针对这个问题的回答是 Xcode 6 Storyboard Unwind Segue 与 Swift 未连接退出 https stackoverflow com questions 24029586 xcode 6 storyboard
  • 查找 3D 坐标是否已被使用的最快方法

    使用 C 和 Qt 我需要处理大量 3D 坐标 具体来说 当我收到 3D 坐标 由 3 个双精度数组成 时 我需要检查列表是否已处理该坐标 如果没有 那么我处理它并将其添加到列表 或容器 中 坐标量可能会变得非常大 因此我需要将处理后的坐标
  • 在路由定义中间使用贪婪路由参数

    我正在尝试创建遵循树导航系统结构的路线 即我想将树中的整个路径包含在我的路线中 所以如果我有一棵像这样的树 Computers Software 发展 Graphics Hardware CPU 显卡 然后我希望能够有这样的路线 site
  • 在 Spring MVC 控制器中注入 Jaxb2Marshaller

    我正在尝试将静态 xml 转换为控制器类中的 POJO 解组 我正在使用 Jaxb2Marshaller 并在我的中按以下方式进行配置根上下文
  • FactoryGirl 覆盖关联对象的属性

    这可能很简单 但我在任何地方都找不到例子 我有两个工厂 FactoryGirl define do factory profile do user title director bio I am very good at things li
  • 可以覆盖位于 jar 依赖项中的 persistence.xml 中的属性

    我有一个 java ee Web 应用程序 它使用打包为 jar 依赖项 实体类 EJB 存储库 persistence xml 的持久性单元 为了让 Web 应用程序运行一些验收测试 我需要覆盖打包的 persistence xml 中的
  • 如何将 3 位毫秒的因子转换为 R 中的日期时间?

    我这样对 t 对象进行计时 t lt c 2016 10 19 00 00 00 000 我需要转换为 POSIXct 如下所示 as POSIXct t format Y m d H M OS 2016 10 19 EDT 我失去了小时
  • 使用字典查找更新 pandas 列

    有一个数据框 df import pandas as pd import numpy as np i dog cat rabbit elephant 3 df pd DataFrame np random randn 12 2 index
  • 如何在 SQL Server 中导入 DBF 文件

    如何在 SQL Server 中导入 FoxPro DBF 文件 使用链接服务器或使用 openrowset 例如 SELECT into SomeTable FROM OPENROWSET MSDASQL Driver Microsoft
  • 协程和 while 循环

    我一直在研究沿着从 Navmesh Unity3d 获得的路径的对象移动 我正在使用协程 其中我用 while 循环控制它 正如我所展示的 public void DrawPath NavMeshPath pathParameter Gam
  • Stripe - 定期付款中包含的附加发票项目

    我在订阅中添加发票项目时遇到问题 目前我的头撞在墙上 我已经在 stripe 上创建了一个发票项目 并且我希望将发票项目包含在定期付款中 这是我的代码 它在第一张发票上添加发票项目 但不在下一张发票上添加发票项目 new customer
  • 如何自定义表单身份验证 cookie 名称?

    我有 2 个网站在不同端口的本地主机上运行 由于浏览器在发送 cookie 时不区分端口号 因此我的表单身份验证票证从一个站点发送到另一个站点 我该如何解决这个问题 我认为一个好的解决方案是更改表单身份验证票或其中一个网站 但我不知道如何执
  • 如何在浏览器刷新后保持 React 组件状态

    感谢您阅读我的第一个问题 我尝试使用react react router 和 firebase 来使用共享根进行身份验证 所以 我想保留App js的用户状态 但是当我尝试刷新浏览器时 找不到用户状态 我尝试保存到本地存储 但是有没有办法在
  • 使用 ASP.NET AJAX 和更新面板时如何处理视图状态的想法

    这是我编写的一个类 用于解决我在视图状态方面遇到的一些问题 它将信息存储在用户会话中并增加一个值来跟踪要显示的状态 困难在于不支持后退按钮 我最初这样做的原因是 在 AJAX 出现之前 视图状态被发送到客户端而不是存储在服务器上 我认为通过