您的位置:首页 > 编程语言 > ASP

【转】怎么让开发的aspx返回的页面网页源文件中没有“乱码”ViewState???

2011-08-14 14:43 459 查看
问:怎么让开发的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文件。垃圾文件与垃圾代码,你会如何选择呢?
==============================================================

页面上的 所有runat="server"去掉, 不要用任何的 服务器控件, 全部采用HTML控件开发,就可以做到, BBSMAX就是.NET开发的, 那看页面源代码,也没有VIEWSTATE其他方法:
http://www.jb51.net/article/17589_2.htm
http://blog.163.com/xu_ming_003/blog/static/122559492010102211233842/去掉.net页面中的<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE2009-03-07 19:28
你可以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,同时保持原先页面的使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐