ASP.NET之ViewState
来源:互联网 发布:广告优化师前景怎样 编辑:程序博客网 时间:2024/06/06 02:51
用Asp.net编写的网页面,其优点就是编译后运行。
除第一次之处,其运行速度比较快。编写程序时MS提供了大量控件和类库,也比较快速的可以建立目标站点。但用aspnet编写的代码用了大量的控件,运行之后生成的HTML文件查看源代码都有一大堆ViewState垃圾代码,这些垃圾代码,一方面增加了网络传输的负担,另一方面不利于搜索引擎收录,搜索引擎不但对其不感冒,可能因此而非常反感,非常不利于SEO优化。
那么有什么办法可以消除这些ViewState呢。
网络上的做法,一般都是设置 EnableViewState="false".这样可以减少很多垃圾代码,但是不完全,仍然存在隐藏域代码,包括CSDN在内查看页面源代码都可以看到
以下是刚才查看的。
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/XXXXXX.... (这里很多) " />
这些东西主要是ASP.net 的<asp:button />提交给Form时储藏信息.只要用到<asp:button>对应的form就必须要加 runat="server" 否则将不能正常运行代码。
那我们从中也可以得到一些启发,主要解决了form 的runat="server" 去掉,是不是可以解决ViewState垃圾代码问题呢,答案是肯定的。
但是不幸的是,form 的runat="server" 去掉之后很多“<asp:”标识的控件用不了。根本发挥不了asp.net控件的优势。
有些提出如果去掉之后,就干脆用html编写了。
那么怎么样既能发挥控件的快速编码优势,又能消去大量垃圾代码呢?
那么就是要特殊处理一下ViewState, 写一个页面基类BasePage。
BasePage继承Page 即 public class BasePage:page
先不多说,直接上代码
public class BasePage:Page
{
/// <summary>
/// 由于这里添加了目录,所以要建立/ViewState目录.
/// </summary>
/// <returns></returns>
protected override object LoadPageStateFromPersistenceMedium()
{
string stateStr = string.Empty;
object obj = null;
try
{
string viewStateID = ((Pair)base.LoadPageStateFromPersistenceMedium()).Second.ToString();
stateStr = Cache[viewStateID].ToString();
if (stateStr == null)
{
string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"ViewState/" + viewStateID);
stateStr = File.ReadAllText(fn);
}
obj = new ObjectStateFormatter().Deserialize(stateStr);
}
catch (System.Exception ex)
{
EEY.Common.ErrorLog.WriteErrorToLog("Log", "加载ViewState有误", ex);
}
return obj;
}
protected override void SavePageStateToPersistenceMedium(object state)
{
try
{
string basePath = this.Request.PhysicalApplicationPath + "ViewState//";
string value = new ObjectStateFormatter().Serialize(state);
//string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码
string viewStateID = DateTime.Now.ToString("yyMMdd");// (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码
string filePath = Path.Combine(basePath, viewStateID);
//System.Threading.ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
if (!Directory.Exists(basePath))
{
Directory.CreateDirectory(basePath);
}
File.WriteAllText(filePath, value);
EEY.Common.Caching.Set(filePath, value, null);//加入到缓存
base.SavePageStateToPersistenceMedium(viewStateID);//先注掉
}
catch (System.Exception ex)
{
EEY.Common.ErrorLog.WriteErrorToLog("Log", "ViewState生成有误", ex);
}
}
}
/// <summary>
/// 重载父类OnInit方法
/// </summary>
/// <param name="e"></param>
protected override void OnInit(EventArgs e)
{
base.OnInit(e); //事件绑定
this.Load += new EventHandler(PageBase_Load);
}
/// <summary>
/// 摘要:页面初始化时执行相关验证
/// </summary>
protected void PageBase_Load(object sender, EventArgs e)
{
...//相关处理
//如权限设置
}
}
然后在页面继承 BasePage
public partial class Default : BasePase
{
//重写OnLoad方法
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
}
}
这类对比原来页面源代码。你会发现截然不同的。页面比较干净了。
另外会在程序根目录下创建一个ViewState文件夹。以文件形式保存,牺牲了一定磁盘空间代价。
- ASP.NET之ViewState
- ASP.NET之ViewState
- ASP.NET WebForm Best Practice 之ViewState
- ASP.NET控件学习笔记之ViewState
- ASP.Net原理篇 之 ViewState
- Asp.Net之ViewState状态保持
- ASP.NET中的ViewState
- ASP.NET ViewState 初探
- ASP.NET中的ViewState
- ASP.NET ViewState 初探
- ASP.NET ViewState 初探
- ASP.NET ViewState
- ASP.NET ViewState 初探
- ASP.NET中的ViewState
- ASP.NET ViewState 初探
- ASP.NET ViewState初探
- ASP.NET ViewState 初探
- ASP.NET ViewState 初探
- C# 一些小细节 初学版
- YY软件下载
- android 中对xml 进行解析
- Linux中find常见用法示例
- 软考--数据通信与网络基础
- ASP.NET之ViewState
- 获取线程中某个函数执行完成所获得的CPU时间量
- MLB Jerseys Sagp core synergistics
- jquery grep
- itemRender---之outerDocument : 使用itemRender 和item Editor时想要访问外部变量或方法的关键字
- 迁移数据库服务器-每个数据库
- asp.net中gridview中数据保存为cvs格式,datatable中
- 一个好领导是非常重要的
- Discuz!nt中的序列化的学习