ASP.Net学习笔记013--ViewState初探2
上课讲的viewstate,由于需要跟后台服务器进行传值,需要封装很多隐藏列,比如100条数据,就会有100个viewstate
如果用在一些小的控件上的话,性能还行:如果用在一些大控件,比如listview,从数据库中取很多数据的时候,
会把数据放到viewstate里,这样滚动条基本上滚的很慢了.
datagridview和listview会默认的把取到的数据,放到viewstate中,就会产生很多用不到的html代码,会拖慢页面加载
---------------------------------------------------------------------------------------------
互联网项目网页中需要部分禁用viewstate,提高加载速度
互联网网站:
禁用viewstate只是把尺寸减小,并不是完全禁用viewstate,要想不用viewstate,只能不是用服务端控件
不使用form,使用原生态的get来实现
-------------------------------------------------------------------------------------------------------
一般网页中:
datagridview和listview,和repeter这种控件需要禁用,普通的控件不用禁用,比如上节课写的例子中的用法:
Repeater 控件用于显示重复的项目列表,这些项目被限制在该控件。
这里说一个学习网站:
http://www.w3school.com.cn/aspnet/aspnet_datalist.asp
--------------------------------------------------------------
看看如何禁用viewstate
1.禁用单个控件的viewstate,可以选中某个控件,然后设置:EnableViewState属性,设置为False就可以了
2.设置整个页面的viewstate:
宽度自增.aspx
---------------------------------------------------------
可以在:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="宽度自增.aspx.cs" Inherits="宽度自增" %>这句话中加入:
<%@ Page Language="C#" EnableViewState="False" AutoEventWireup="true" CodeFile="宽度自增.aspx.cs" 
Inherits="宽度自增" %>
EnableViewState="False"这样的一句,来禁用整个页面的viewstate
--------------------------------------------------------------------------------
利用:EnableViewState="False"禁用viewstate的值,之后访问宽度自增.aspx

<%@ Page Language="C#" EnableViewState="False" AutoEventWireup="true" CodeFile="宽度自增.aspx.cs" Inherits="宽度自增" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        #form1
        {
            height: 70px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <asp:Button ID="Button1" runat="server" οnclick="Button1_Click" Text="Button" />
    <div>    <asp:TextBox ID="TextBox1" runat="server">0</asp:TextBox>
        <asp:Button ID="Button2" runat="server" οnclick="Button2_Click" Text="Button" />
    </div>

</form>
</body>
</html>
-------------------------------------------------
这个时候,点击label旁边的按钮的时候发现服务器报错:
“/WebSiteTest”应用程序中的服务器错误。

输入字符串的格式不正确。

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.FormatException: 输入字符串的格式不正确。

源错误:

行 17:     protected void Button1_Click(object sender, EventArgs e)
行 18:     {//取到label的值,然后自增后赋值回去
行 19:         int i = Convert.ToInt32(Label1.Text);
行 20:             i++;
行 21:             Label1.Text = i.ToString();

源文件: g:\NET学习\workspace\WebSiteTest\宽度自增.aspx.cs    行: 19

堆栈跟踪: 
[FormatException: 输入字符串的格式不正确。]
   System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +11013491
   System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) +145
   System.Convert.ToInt32(String value) +43
   宽度自增.Button1_Click(Object sender, EventArgs e) in g:\NET学习\workspace\WebSiteTest\宽度自增.aspx.cs:19
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9628442
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.34280
-------------------------------------------------------------------------
报错的位置就是:
 int i = Convert.ToInt32(Label1.Text);
 这里取不到:Label1.Text的值了
 ---------------------------------------------------------------------------------
可以改一下:
宽度自增.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class 宽度自增 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack ){//直接进入的时候设置为0
            Label1.Text = "0";
            //IsPostBack这里的IsPostBack就是,以前讲的通过隐藏字段传递的
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {//取到label的值,然后自增后赋值回去

//---------------------修改的这个地方,加了这样的两句话----------------
        Response.Write(Label1.Text .Length );
        return;
//---------------------修改的这个地方,加了这样的两句话----------------

int i = Convert.ToInt32(Label1.Text);
            i++;
            Label1.Text = i.ToString();
    }

protected void Button2_Click(object sender, EventArgs e)
    {
        //值自增
        int i = Convert.ToInt32(TextBox1.Text);
        i++;
        TextBox1.Text = i.ToString();
        //宽度自增
        //TextBox1 .Width.Type  = UnitType.Pixel;
        //通过上面这个代码可以看到:
        //这个宽度的单位是unit
        TextBox1.Width = new Unit(TextBox1 .Width .Value +10);
        //每次都增加十个像素
    }
}

访问地址:
http://localhost:53627/WebSiteTest/%E5%AE%BD%E5%BA%A6%E8%87%AA%E5%A2%9E.aspx
%E5%AE%BD%E5%BA%A6%E8%87%AA%E5%A2%9E.aspx由于编码问题显示成了UT8编码的格式
可以看到
点击按钮的时候,打印出Label1.Text .Length的长度就返回了,但是这个时候按第二个text框旁边的
按钮的时候,是没有问题的,因为input表单类型的控件不需要viewstate就可以提交数据
-------------------------------------------------------------------------
一般就是禁用listview等的viewstate就可以
---------------------------------------------------------------------------------
内网系统,互联网后台可以用viewstate
--------------------------------------------------
讨论:为什么
label.text这里用.就可以.出来
内部从viewstate取的,解析viewstate后得出的结果
--------------------------------------------------
这里可以用.NET Reflector来反编译Label这个类,可以得到:
public virtual string get_Text(){
object obj2 = this.ViewState["Text"];
....
}
可以看到底层就是从viewstate中获取的,viewstate先存储为xml然后编码成html显示的内容
--------------------------------------------------
出现上面的问题的根本原因就是:
http是无状态的协议,不会记得上次和网页发生了什么,如果要知道上一次的状态
一个方法是在对浏览器相应结束之前将状态信息保存到页面表单中,下次页面再向
服务器发出请求的时候带上这些状态信息,这样服务器就能根据这些状态信息还原
上次的状态了,类似于看病的病历本
----------------------------------------
状态信息保存在隐藏字段中的缺点:
加大网站的流量,降低访问速度,机密数据放到表单中会有数据欺骗等安全性问题
-----------------------------------------------------------------------
就像电影:
女孩[浏览器]生病了只能记住24小时的内容,
男孩[服务器]就拿相机把女孩[浏览器]每天的活动都录下来,第二天再给她看
但这里也有问题:
男孩如果骗女孩的话,女孩也会信以为真

ASP.Net学习笔记013--ViewState初探2相关推荐

  1. ASP.NET 学习笔记_13 viewstate 和 cache

    1. (1.默认情况下ASP.Net是启用ViewState的,这样在页面中会生成冗长的隐藏字段,ViewState对于需要PostBack处理的页面才可能有用,对于新闻展示页面不需要交互完全没必要用 ...

  2. ASP.Net学习笔记014--ViewState初探3

    ASP.Net学习笔记014--ViewState初探3 为什么禁用了viewstate,还能修改label2的值 因为:viewstate只是记录label2的值,并不影响给label2进行设置 - ...

  3. ASP.Net学习笔记015--ASP.Net中使用Cookie

    ASP.Net学习笔记015--ASP.Net中使用Cookie 表单数据欺骗: 原理跟收到欺骗短信一样,移动信号塔[基站],伪装的移动信号塔会屏蔽移动信号,并且 在信号范围内的手机会自动切换为接收伪 ...

  4. ASP.Net学习笔记008--ASP.Net揭秘之Input版自增补充说明

    以前写的课程都没有附上源码,很抱歉! ASP.Net学习笔记007ASP.Net Input版自增.zip http://credream.7958.com/down_20155694.html 1. ...

  5. ASP.Net学习笔记007--ASP.Net Input版自增

    2016/1/18 以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交流qq2群:170933152 也可以自己下载: ...

  6. ASP.Net学习笔记006--Get和Post的区别

    以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交流qq2群:170933152 也可以自己下载: ASP.Net学习 ...

  7. ASP.Net学习笔记005--ASP.Net的IsPostBack揭秘

    以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交流qq2群:170933152 也可以自己下载: ASP.Net学习 ...

  8. ASP.Net学习笔记004--基于ashx方式的ASP.Net开发1

    以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交流qq2群:170933152 也可以自己下载: ASP.Net学习 ...

  9. ASP.Net学习笔记003--网站和WebApplication的区别

    以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交流qq2群:170933152 也可以自己下载: ASP.Net学习 ...

最新文章

  1. IIS虚拟目录实现与文件服务器网络驱动器映射共享
  2. 简单易用的IT运维服务器管理程序分享!
  3. 视觉SLAM笔记(3) 视觉SLAM框架
  4. vim命令模式和底线_人生苦短!老鸟带你用Vim偷懒!
  5. Android未发现目标设备,Android设备不会显示为Unity3d调试的目标
  6. (43)Verilog HDL 二分频设计
  7. 易用性强的数据库管理工具DBeaverEE v22.0.1
  8. python对象之间的关系
  9. 计算机联锁维修管理机,计算机联锁试卷
  10. Python实现日程表
  11. VCS/Questa SIM 使用流程及Makefile
  12. php数据传输神器,「curl」PHP中的传输神器
  13. python求三位水仙花数
  14. dell笔记本外接显示器_笔记本就一个 hdmi 的接口,如何外接 2 个 dell 显示器?...
  15. 小型企业网络设计与规划
  16. 【愚公系列】2021年11月 攻防世界-进阶题-MISC-032(就在其中)
  17. CentOS7安装可移植Prometheus+grafana--pushgateway及自定义监控
  18. matlab fsolve 解的范围,【求助】用fsolve解四元非线性方程组,求解参数的范围问题...
  19. 杰理之音箱蓝牙发射器和接收器之间进行对讲的demo
  20. 《四川省建设工程安全文明施工费计价管理办法》的通知〔2017〕5(二)

热门文章

  1. 西瓜书《支持向量机SVM》 原始形式推导+拉格朗日乘数法的SVM形式+SVM对偶形式推导+SMO算法推导
  2. linux中引入python的tkinter模块
  3. Python自动化运维开发----基础(十二)函数
  4. linux模拟磁盘和用户管理总结
  5. iOS动画:带时分秒指针的时钟动画(上)
  6. nginx安装和配置实例
  7. CSS图片裁剪Clip
  8. 实践总结 - 不可错过的Angular应用技巧
  9. 飘逸的python - 简明gzip模块压缩教程
  10. java Date 转mysql timestamp 秒数不一致