【转】怎么让开发的aspx返回的页面网页源文件中没有“乱码”ViewState???
问:怎么让开发的aspx返回的页面网页源文件中没有Value="/wEPDwUKMTQxODY3MTE1NWRk9iXX,什么hidden" name="__EVENTTARGET" 这些东西?
说明:返回的页面代码都是标准的HTML组件?有例子没有?推荐书籍也可以。
开发的ASPX网页导出都是下面这些东西,
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTQxODY3MTE1NWRk9iHjuuUMfWmhGo2eEV4u7BYhLxA=" />
又是VALUE是一大堆东西?
我看有些的ASPX网站,查看网页源文件,代码贴别的干净。就是JS和标准的HTML标签。
去掉asp.net网页打开后用右键查看源代码中间有一段乱码
回答一:
<%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
加上EnableViewState="false"这个就OK了 不要显示视图状态,
我试过,实际上无法关闭ViewState。,不行。
回答二:
在asp时代, 大家都知道一个html控件的值,比如input 控件值,当我们把表单提交到服务器后, 页面再刷新回来的时候, input里面的数据已经被清空. 这是因为web的无状态性导致的, 服务端每次把html输出到客户端后就不再于客户端有联系.
asp.net巧妙的改变了这一点. 当我们在写一个asp.net表单时, 一旦标明了 form runat=server ,那么,asp.net就会自动在输出时给页面添加一个隐藏域
<input type="hidden" name="__VIEWSTATE" value="">
那么,有了这个隐藏域,页面里其他所有的控件的状态,包括页面本身的一些状态都会保存到这个控件值里面. 每次页面提交时一起提交到后台,asp.net对其中的值进行解码,然后输出时再根据这个值来恢复各个控件的状态. 我们再看这个控件的value值,它可能类似如下的形式:Oz4+O2w8aTwxPjs+O2w8....
很多人会认为这是加密的信息,其实不是, ms仅仅是给各个控件和页面的状态存入适当的对象里面,然后把该对象序列化, 最后再做一次base64编码,直接赋值给viewstate控件.
说到这,想必你一定想看看这个viewstate里面到底存了哪些东西, 嗯,你是可以写一个base64 to string的转换代码来实现.不过,viewstate是有层次之分的,普通的转换后,你看到的也是很乱的文字. 这里提供了一个专门转换viewstate值的地方http://www.wilsondotnet.com/Demos/ViewState.aspx. 你可以去将自己的viewstate输入进去,让它给你转化一下,这可是带结构的哦
好, 以上说的这些你可能会觉得: 这与session有什么关系? 这个viewstate不是由asp.net自动去维护吗? 是的, 如果仅仅是保存控件的状态, 你可以感觉不到它与session有什么瓜葛( 呵呵,其实它们就没有瓜葛),不过,接下来,我们看看这种使用方法: 在后台aspx.cs代码里:
private void Page_Load(object sender, System.EventArgs e)
{
ViewState["myvalue"] = "viewstatevalue";
//.....
}
呵呵, 可以在页面后台直接给viewstate集合赋值, 现在你是不是觉得和session的使用方法差不多了呢? 对,这一点就是几乎所有初学asp.net的人的疑惑. 会认为asp.net也像session那样把这个值保存到服务器内存里面, 其实不是!
那么,这里的viewstate值是属于谁?又存在哪里? 其实,它和上面的其他控件的状态保存一样,也是存储到那个隐藏的viewstate控件值里面, 上面已经说了, viewstate用来保存状态,包括页面本身, 那么,这里的viewstate就属于页面本身的状态.
转载者认为:看样子还得按照老样子的ASP或者ASP记事本来编写ASP.NET代码了,和早期的ASP开发没有什么不同。
方法:
这是你用ASP.NET控件自动生成的,无法去除如果你想代码整洁,尽量使用Html标签那个是ASP生成的时候自动生成的HTML代码,这个不会影响你的页面的
这是你用ASP.NET控件自动生成的,无法去除如果你想代码整洁,尽量使用Html标签================================================= asp.net页面去掉ViewState的input方法一:在顶部中加入 EnableViewState="false" EnableViewStateMac="false",就可以去掉了,前提是你用不到它(这个方法有时候并没有彻底去掉了__VIEWSTATE代码)<%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" %> ViewState的input是指:<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTEzN"/>方法二:asp.net 去掉viewstate 收藏
转载地址:http://blog.csdn.net/zhou5157/archive/2010/05/07/5567667.aspx
解决办法:app_code/ 存放一个类 用来截获HTTP
1.代码如下
using System;
using System.IO;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;
/// <summary>
/// Removes whitespace from the webpage.
/// </summary>
public class ViewstateModule : IHttpModule
{
#region IHttpModule Members
void IHttpModule.Dispose()
{
// Nothing to dispose;
}
void IHttpModule.Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
#endregion
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
//if (app.Request.Url.OriginalString.Contains(".aspx"))
//{
// app.Response.Filter = new ViewstateFilter(app.Response.Filter);
//}
//reg/目录下的不进行优化 因为发现render 后,验证码不能显示
if (!app.Request.Url.OriginalString.Contains("/reg/"))
{
if (app.Request.Url.OriginalString.Contains(".aspx"))
{
app.Response.Filter = new ViewstateFilter(app.Response.Filter);
}
}
//静态化后重也要处理
if (app.Request.Url.OriginalString.Contains(".html"))
{
app.Response.Filter = new ViewstateFilter(app.Response.Filter);
}
}
#region Stream filter
private class ViewstateFilter : Stream
{
public ViewstateFilter(Stream sink)
{
_sink = sink;
}
private Stream _sink;
#region Properites
public override bool CanRead
{
get { return true; }
}
public override bool CanSeek
{
get { return true; }
}
public override bool CanWrite
{
get { return true; }
}
public override void Flush()
{
_sink.Flush();
}
public override long Length
{
get { return 0; }
}
private long _position;
public override long Position
{
get { return _position; }
set { _position = value; }
}
#endregion
#region Methods
public override int Read(byte[] buffer, int offset, int count)
{
return _sink.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin)
{
return _sink.Seek(offset, origin);
}
public override void SetLength(long value)
{
_sink.SetLength(value);
}
public override void Close()
{
_sink.Close();
}
public override void Write(byte[] buffer, int offset, int count)
{
byte[] data = new byte[count];
Buffer.BlockCopy(buffer, offset, data, 0, count);
string html = System.Text.Encoding.Default.GetString(buffer);
int startPoint = html.IndexOf("<input type=\"hidden\" name=\"__VIEWSTATE\"");
if (startPoint >= 0)
{
int endPoint = html.IndexOf("/>", startPoint) + 2;
string viewstateInput = html.Substring(startPoint, endPoint - startPoint);
html = html.Remove(startPoint, endPoint - startPoint);
int formEndStart = html.IndexOf("</form>") - 1;
if (formEndStart >= 0)
{
html = html.Insert(formEndStart, viewstateInput);
}
}
//Nick add 2010.05.07
startPoint = html.IndexOf("<input type=\"hidden\" name=\"__EVENTVALIDATION\"");
if (startPoint >= 0)
{
int endPoint = html.IndexOf("/>", startPoint) + 2;
string viewstateInput = html.Substring(startPoint, endPoint - startPoint);
html = html.Remove(startPoint, endPoint - startPoint);
int formEndStart = html.IndexOf("</form>") - 1;
if (formEndStart >= 0)
{
html = html.Insert(formEndStart, viewstateInput);
}
}
//end add
byte[] outdata = System.Text.Encoding.Default.GetBytes(html);
_sink.Write(outdata, 0, outdata.GetLength(0));
}
#endregion
}
#endregion
}
2.在web.config 加入以下代码
<httpModules>
<add type="ViewstateModule" name="ViewstateModule"/>
</httpModules>
就能去掉viewstate,但是页面的状态就没有了。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhou5157/archive/2010/05/07/5567667.aspx
asp.net在SEO上的致命要素:冗余代码,去掉viewstate生成的代码
asp.net生成的viewstate垃圾信息超过了20K,如果页面前二K不是内容会被引擎处罚。1.网上查找解决办法,将viewstate信息移动到页面的最后。采用此办法的确把viewstate 移到网页尾部,但也造成了部分网页显示不正常。后来发现可以关闭网页的viewstate 装态,把viewstate 变小。
比如:
value=" http://blog.soso.com/wEPDwUJNjE5MDk0OTc0D2QWAmYPZBYCAgMQZGQWBAI BD2QWCAIDDxYCHgdWaXNpYmxlaGQCBQ8WAh4EVGV4dAVmPGEgaH JlZj0idXJsLmFzcHg/dXJsPXd3dy5pZ3hlLmNvbS5jbiIgdGFyZ 2V0PSJfYmxhbmsiPjxpbWcgc3JjPSJpbWFnZXMvc2hvdy90b3Aw MDEuZ2lmIiBhbHQ9IiIgLz48L2E+ZAIHDxYCHgtfIUl0ZW1Db3V udAIQFiBmD2QWAmYPFQMmaHR0cDovL3d3dy56aHVhbnlld2Fuam lhLmNvbS9SYW5rLmh0bWwDcmVkDOa4uOaIj+aOkuihjGQCAQ9kF gJmDxUDKmh0dHA6Ly93d3cuemh1YW55ZXdhbmppYS5jb20vR2Ft ZVNpdGUuaHRtbARibHVlDOa4uOaIj+WumOe9kWQCAg9kFgJmDxU DJ2h0dHA6Ly93d3cuemh1YW55ZXdhbmppYS5jb20vVG9vbHMuaH RtbANyZWQM5Zyo57q/5bel5YW3ZAIDD2QWAmYPFQMtaHR0cDovL 3d3dy56aHVhbnlld2FuamlhLmNvbS9OZXdzLjUuTGlzdC5odG1s BGJsdWUM572R5ri45oqA5pyvZAIED2QWAmYPFQMpaHR0cDovL3d 3dy56aHVhbnlld2FuamlhLmNvbS9HYW1lQXBwLmh0bWwDcmVkD+ .....
2.查询老外的解决办法,是将代码移动到尾部,但发现部分网页报错, 之后发现把网页的enableviewatate=false 明显的viewstate 代码减少。
原因总结:
(1)、这是由于net记录控件视图状态的. asp.net服务器控件默认都记录的.
如果你确定一个控件是不需要记录控件状态,可以给他的EnableViewState赋值false禁用.
个人总结:
关闭视图也不是最终解决办法,只会减少,最彻底的办法就是把form表单做成普通的html标签。
省去runat="server"就可以。程序尽管重要,但如果做出来的程序没有什么效果,是没有意义的,
网友见解:
视图状态,这可不是什么无用的代码。你使用服务器控件,为什么在每一次提交后,会将信息以控件对象的方式读取到呢?都是因为有了视图状态。
视图状态是可以禁用的,不过只使用EnableViewState=false是不彻底的,你还会在页面中看到__VIEWSTATE的隐藏域。这是因为就算禁用了他,还是会有一个服务器控件在那里使用,就是from runat="server",如果你将from编程普通html标签,那么页面就干净了。
当然,禁用视图状态后,是会提升系统效率的,因为程序不会再去分析视图状态中值,再为控件对象初始化了。这样做对于网站来说是高效的,但如果是做引用程序,那就有点自找麻烦了。微软提供了这么方便的方法你不用,可不是自讨苦吃吗?! 加载中,请稍候......
=========================================
去掉.net页面中的<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE ?
不用去掉
protected override object LoadPageStateFromPersistenceMedium()
{
return null;
}
protected override void SavePageStateToPersistenceMedium(object viewState) { }
重写这两个方法就可以
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//添加引用
using System.IO;
using System.Threading;
namespace CCL
{
/// <summary>
/// BasePage 的摘要说明
public class BasePage : System.Web.UI.Page
{
//由于这里添加了目录,所以要建立App_Data/ViewState目录.
protected override object LoadPageStateFromPersistenceMedium()
{
string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
)Cache[viewStateID];
if (stateStr == null)
{
string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
stateStr = File.ReadAllText(fn);
}
return new ObjectStateFormatter().Deserialize(stateStr);
}
protected override void SavePageStateToPersistenceMedium(object state)
{
string value = new ObjectStateFormatter().Serialize(state);
string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码
string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
//ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
File.WriteAllText(fn, value);
Cache.Insert(viewStateID, value);
base.SavePageStateToPersistenceMedium(viewStateID);
}
#endregion
}
}
string stateStr = (string#region 解决ViewState过于庞大的问题/// </summary>
不过这样写会产生大量的ViewState文件。垃圾文件与垃圾代码,你会如何选择呢?
==============================================================
你可以post,get方法提交
<form action="xxx.aspx" ...>,去掉原来的runat = server
微软的webForm使很多没接触过asp,jsp..等的新手变成了傻子.-_-!
ViewState 在 Page.SavePageStateToPersistenceMedium 方法中被保存, 回发时,在 Page.LoadPageStateFromPersistanceMedium 方法中被恢复。 这是我在看“木野狐”翻译的一篇文章中看到的,那么我们可以将其存到session中去,代码如下,来自网络,自做简单修改:
// 去除VIEWSTATE 生成源代码,并保证VIEWSTATE 同时有效
protected LosFormatter losFormatter = new LosFormatter();
protected override object LoadPageStateFromPersistenceMedium()
{
string key = Request.Url + "__VIEWSTATE";
if (Session[key] != null)
{
System.IO.MemoryStream stream = (System.IO.MemoryStream)Session[key];
stream.Seek(0, System.IO.SeekOrigin.Begin);
return losFormatter.Deserialize(stream);
}
return null;
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
string key = Request.Url + "__VIEWSTATE";
System.IO.MemoryStream stream = new System.IO.MemoryStream();
losFormatter.Serialize(stream, viewState);
stream.Flush();
Session[key] = stream;
}
那么看看现在的viewstate:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id=" __VIEWSTATE" value="" />
到这一步,我们实现我们要用的功能,去除viewstate,同时保持原先页面的使用。