ASP.NET Core——状态管理之视图状态

  在实际项目中,常常需要保存用户信息来简化掉一些不必要的重复动作,提供人性化和智能的交互方式。然而HTTP协议是无状态的,每个新页面请求都是接。ASP.NET提供了保存状态的不同选项,使得状态额可以在客户端或服务器上保存。

  要在客户端保存状态,ASP.NET提供了视图状态、cookie和参数选项。因为安全问题,使用这些状态有一些限制。在服务器端可以使用会话对象、全局应用程序状态、缓存和用户配置文件来保存状态。

  ASP.NET也提供了一些用于访问状态管理功能的属性。例如,HttpSessionState对象可以在Page类的Session属性中直接访问。也可以使用HttpContext获得HttpSessionState,HttpContext.Current返回活动的HttpContext对象,这个类的Session属性也可以返回HttpSessionState。

  下面将分别解析这些不同的状态管理选项。示例使用ASP.NET Web Forms页面及Textbox、Label和Button控件,来演示不同的状态功能。

视图状态

  视图状态仅在页面内部可用。只要用户位于同一个页面中,就可以使用视图状态。视图状态在页面中创建隐藏的HTML字段,该字段会发送给服务器,因为它位于<form>标记中。视图状态可以使用Page的ViewState属性来访问,ViewState会返回一个StateBag对象。把一个键值传递给索引器,就可以使用视图状态来读写数据。

  在以下示例代码中:

protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = string.Format("TextBox1.Text:{0}", TextBox1.Text);
        Label2.Text = string.Format("ViewState[\"state1\"]{0}", ViewState["state1"]);
        ViewState["state1"] = TextBox1.Text;
    }

  第一次打开页面时,还没有调用Bbutton1_Click方法,两个标签都显示初始值。把one写入文本框并单击按钮第一次调用Bbutton1_Click方法,就会给服务器发送一个回发。此时,TextBox1.Text属性返回输入的数据,因为第一个Label用这个数据填充,第二个Label只显示消息的第一部分,ViewState["state1"]返回为空。把two写入文本框,第二次单击按钮,则给服务器发送另一个回发,ViewState["state1"]现在返回上一次输入的数据one,TextBox1.Text返回新字符串two。

  视图状态使用页面中的隐藏字段来存储:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNTAzMzI1MjcyDxYCHgZzdGF0ZTEFA3R3bxYCAgMPZBYEAgEPDxYCHgRUZXh0BRFUZXh0Qm94MS5UZXh0OnR3b2RkAgUPDxYCHwEFFlZpZXdTdGF0ZVsic3RhdGUxIl10d29kZGS/Lx64nbzEp3zavs9xOCFUE+yVx8Z01piL0emNSmVtSA==" />

  使用隐藏字段的优点是没有超时,只要页面处于打开状态,就存在隐藏字段,并在下次回发时发送给服务器。如果用户关闭页面,状态就消失了;如果用户切换到另一个页面上,状态也会消失。视图状态的缺点是状态必须在字符串中表示,所有的视图状态数据总是通过网络发送,这可能涉及传输大量数据,降低了性能。

  特别地,ASP.NET服务器端控件使用视图状态,服务器端事件模型基于该状态模型,把窗体内容发送给服务器时,窗体会在视图状态中包含文本框的以前值,在文本框中包含当前值。这样,事件机制就可以确定是否为出发变动事件,并调用响应的处理方法。

时间: 2024-11-05 21:54:10

ASP.NET Core——状态管理之视图状态的相关文章

Asp.net Web 状态管理

最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望对园友有帮助,这是一件很开心的事情 4. 希望大侠们看到问题及时帮忙指正,不想误导自己,更不想误导园友,在下不胜感激 不再磨叽,马上上菜 名称 用户 生存时间 数据 位置 优势 劣势 建议 Application 所有用户 应用程序重新启动 没有限制,只被存储一次 服务器,可以存储在数据库 1. 实

ASP.NET Web – 状态管理

状态类型 客户端或服务器资源 有效时间 ViewState 客户端 只在一个页面中 Cookie 客户端 关闭浏览器时会删除临时cookie,永久cookie存储在客户系统的磁盘上 Session 服务器 会话状态与浏览器相关.会话在超时(默认为20分钟)后变得无效 Application 服务器 在所有的客户端上共享应用程序状态,这个状态在服务器重新启动之前都是有效的 Cache 服务器 类似于应用程序状态,缓存是共享的.但是,使缓存无效有更好的控制方式 客户端的状态管理 -ViewState

ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package

目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我的项目结构如下: 可以看到解决方案中就两个项目,AspNetCoreWebApp就是一个ASP.NET CORE MVC 2.0的项目,而MyNetCoreLib是一个.Net Core 2.0的类库项目,为了体现AspNetCoreWebApp是通过程序集来引用MyNetCoreLib的,我还在解

Asp.Net Core 项目实战之权限管理系统(6) 功能管理

0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计 3 Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL 4 Asp.Net Core 项目实战之权限管理系统(4) 依赖注入.仓储.服务的多项目分层实现 5 Asp.Net Core 项目实

ASP.NET状态管理详解,让你明明白白

开发WinFrom的程序员可能不会在意维护应用程序的状态,因为WinFrom本身就在客户端运行,可以直接在内存中维护其应用程序状态.但ASP.NET应用程序在服务器端运行,客户端使用无状态的http协议对ASP.NET应用程序发出请求,ASP.NET应用程序响应用户请求,向客户端发送请求的HTML代码,服务器并不会维护任何客户端状态.考虑一个有成千上万并发用户的服务器,如果为每一个用户都维护状态的话会耗费非常多的资源. 由于使用无状态的http协议作为web应用程序的通信协议,当客户端每次请求页

ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走.今天,我们就研究一下在事件处理器中,对象生命周期的管理问题. 事实上,不仅仅是在事件处理器中,我们需要关心对象的生命周期,在整个ASP.NET Core Web API的应用程序里,我们需要理解并仔细推敲被注册到IoC容器中的服务,它们的生命周期应该是个怎样的情形,这也是服务端应用程序设

asp.net core系列 30 EF管理数据库架构--必备知识 迁移

原文:asp.net core系列 30 EF管理数据库架构--必备知识 迁移 一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为准,请使用迁移. 对 EF Core 模型进行更改时,此方法会以增量方式将相应架构更改应用到数据库,以使数据库保持与 EF Core 模型兼容.  (2)如果希望以数据库架构为准,请使用反向工程. 使用此方法,可通过将数

ASP.NET Core on K8S深入学习(10)K8S包管理器Helm

本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Helm 1.1 为何需要Helm? 虽然K8S能够很好地组织和编排容器,但是缺少一个更高层次的应用打包工具,而Helm就是专门干这个事的. 通过Helm能够帮助开发者定义.安装和升级Kubernetes中的容器云应用.同时,也可以通过Helm进行容器云应用的分享. 1.2 Helm的架构 Helm的整体架构如下图(图片来源-Kubernetes中文社区)所示: Helm架构由

使用NuGet将我们的ASP.NET Core类库打包并将程序包(类库)发布到NuGet平台上进行管理

本章将和大家简单分享下如何使用NuGet将我们的ASP.NET Core类库打包并将程序包(类库)发布到NuGet平台上进行管理. 一.注册并登录NuGet平台 NuGet官网:https://www.nuget.org/ 此处我使用的是微软账号进行关联登录 登录成功后就可以管理个人信息了,此处就不做过多的描述了 二.下载nuget.exe文件进行ASP.NET Core类库打包 下载完成后如下: 接着修改类库版本等相关信息,点击类库右键属性并选择打包,如下所示: 修改完成后记得保存并重新生成