高分问一个有关ViewState的问题!希望能得到你的帮助^_^

SweetSir 2003-07-23 07:38:12
我们知道Asp.net中在保存一般的控件状态时利用ViewState.现在我自定义了一个控件(Form),这个控件根据需要有时要返回ViewState,有时不需要返回。
也就是说这个Form有时(属性设置)起到Asp.net Form的作用,即返回ViewState,在页面上自动生成<input type=hidden name=_viewstate value=794784gdgf>;当然我也可以禁止它产生这些东西。即不要<input ...>
...全文
54 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_new 2003-08-01
  • 打赏
  • 举报
回复
提前!
li_new 2003-07-30
  • 打赏
  • 举报
回复
saucer(思归, MS .NET MVP):
真的非常感谢你的帮助,你上面贴的网址我看过(http://aspalliance.com/PaulWilson/Articles/?id=4
),不过那是要钱的。而且他的解决方法也是javascript。
我只是想从源头上解决这个问题。或者说我想把这个贴子作为讨论贴,大家来一起探讨ViewState的核心实现。
这个贴子的结贴时间会很长!
^_^
li_new 2003-07-30
  • 打赏
  • 举报
回复
提前!
qimini 2003-07-29
  • 打赏
  • 举报
回复
收藏
saucer 2003-07-29
  • 打赏
  • 举报
回复
the ultimate solution to use your own HtmlForm and Page class, see

Multiple Forms and Non-PostBack Forms
http://aspalliance.com/PaulWilson/Articles/?id=4
suhuoqiang 2003-07-28
  • 打赏
  • 举报
回复
提前!
li_new 2003-07-28
  • 打赏
  • 举报
回复
JavaScript的解决方案是在加一个onsubmit。当submit onclick的时候我们就可以修改hidden的name。如果将name改掉那问题也就可以解决了。当然这种方法是从外部处理的。我更希望能从内部原理上解决这个问题!
suhuoqiang 2003-07-27
  • 打赏
  • 举报
回复
up
SweetSir 2003-07-26
  • 打赏
  • 举报
回复
提前!
saucer 2003-07-25
  • 打赏
  • 举报
回复
here is a good article on ViewState by Paul Wilson:
ViewState: All You Wanted to Know
http://aspalliance.com/PaulWilson/Articles/?id=7

if you hate ViewState so much, you can turn it off by overriding these two methods for your page:

protected override object LoadPageStateFromPersistenceMedium()
{
return null;
}

protected override void SavePageStateToPersistenceMedium(object viewState)
{
}
goody9807 2003-07-25
  • 打赏
  • 举报
回复
up
li_new 2003-07-25
  • 打赏
  • 举报
回复
再次提前,期待高手关注,深入讨论、研究。
^_^
saucer 2003-07-25
  • 打赏
  • 举报
回复
if you override the two methods like above, you will completely eliminate "__VIEWSTATE" control

>>>就是报viewstate valid问题

you can always define
<%@ Page EnableViewStateMac="false" %>

or similar setting in web.config, then ASP.NET will not complain about invalid ViewState
li_new 2003-07-25
  • 打赏
  • 举报
回复
net_lover(孟子E章):
问题不是那么简单!
孟子E章 2003-07-25
  • 打赏
  • 举报
回复
http://www.stardeveloper.com/articles/display.html?article=2003061901&page=1

看看这个
li_new 2003-07-25
  • 打赏
  • 举报
回复
saucer(思归, MS .NET MVP):
非常感谢你的热心回答,但我想你可能并没有完全理解我的意思^_^
在asp页面下我们可以自由的利用action="new page"将页面转到别的页面去。但是在asp.net中我们是不能这样的。因为在asp.net中当form runat="server"的时候页面的action默认是返回本页。现在我已经实现改变action,但困难的是,我没有办法去掉hidden。当我改变action的时候,如果submit form。那么hidden中的值肯定会被提交过去的,而据我了解,如果提交的页面中含有hidden字段,同时name="__VIEWSTATE"的话,asp.net服务器就会自动分析viewstate。这时就会引起两个页面的viewstate验证码不一致的情况,就是报viewstate valid问题。
其实如果asp.net 服务器不产生hidden 并且name=="__VIEWSTATE"这个字段就会完全避免这个问题的出现。
我想这个问题应该是有地方解决的。
关于这个问题的一个不是很好的解决方案是:当submit onclick的时候我们就将hidden的name改变。
li_new 2003-07-24
  • 打赏
  • 举报
回复
再次提前,期待高手关注,深入讨论、研究。
^_^
li_new 2003-07-24
  • 打赏
  • 举报
回复
To:goody9807()兄
timmy3310的这篇文章我读过。其实我的想法很简单就是能够在页面之间自由的转。对于form我们知道hidden类型的Value是自动发到服务器的,同时还有一个问题就是在Asp.net中页面是只能会给自己的(form的action是给自己)。现在的那么现在有一个问题:页面在回传的过程中我可以给变action的方向,同时也不准它在页面产生hidden。这样的话这就是一个普通的asp form,这样你submit form的时候是没有错的。但如果页面含有hidden那么在submit form的时候是会报错的。viewstate不合法错误。
问题的关键点就是Asp.net是怎么样在页面产生hidden的。这样hidden在服务其中是怎么运行的。服务器是怎么检验、区分不同页面之间的ViewState
saucer 2003-07-24
  • 打赏
  • 举报
回复
it is not as simple as you would think, but try the following (it is a hack, and I didn't test it, so it may not work):

namespace CustomeControls
{
public class YourForm : HtmlForm
{
bool m_ASPXStyle;
string m_Action;

public bool ASPXStyle
{
get { return m_ASPXStyle;}
set { m_ASPXStyle = value;}
}

public bool Action
{
get { return m_Action;}
set { m_Action=value;}
}
protected override void Render(HtmlTextWriter output)
{
base.Render(output);
if (!ASPXStyle)
{

//use Page.RegisterStartupScript to emit some javascript code to remove the __VIEWSTATE control from the form on the client side
//set up the right action
//...

}
}

}
}
goody9807 2003-07-24
  • 打赏
  • 举报
回复
ViewState 这是我们今天重点讨论的;实际上ViewState并不神秘,就是一个Hidden字段,但是它是服务器控件状态保存的基础;不熟悉的朋友可以用IE查看Html源码,找到一个名为"__VIEWSTATE"的Hidden字段,其中有一大堆乱七八糟的字符,这就是页面的ViewState。

做过Web程序的人可能都有这种痛苦的体会,有时候为了处理页面上面比较复杂的功能,常常会加很多Hidden,然后在服务器端用一大堆判断来分析目前的状态,写起来烦人,写完了代码更是难看;实际上,ViewState就是帮我们系统的实现了保存控件状态的功能,服务器端控件能够在多次请求间保存状态也全靠它。



好,介绍就到这里,今天我们不是讨论ViewState的使用,而是从内部来探探这个东西的本质。
我们首先建一个测试的页面:
<%@ Page language="c#" Codebehind="ViewStateTest.aspx.cs" AutoEventWireup="false" Inherits="CsdnTest.ViewStateTest" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
<title>ViewStateTest</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body>
<form id="ViewStateTest" method="post" runat="server">
<asp:Button ID="btnPostBack" Runat="server" Text="Post Back" Width="85px"></asp:Button>
<br/>
<asp:CheckBox ID="chkTest" Runat="server" Text="This is a check box"></asp:CheckBox>
</form>
</body>
</html>

这是用Vs.Net设计出来的一个简单的页面,里面包含了一个服务器端的按钮和一个CheckBox,然后我们在服务器端响应按钮的事件:

private void btnPostBack_Click(object sender, System.EventArgs e)
{
[1] Response.Write( "ViewState :"+Request.Params["__VIEWSTATE"]+"<br/>" );

[2] string decodeValue = Encoding.UTF8.GetString( Convert.FromBase64String( Request.Params["__VIEWSTATE"] ) );

[3] Response.Write( "ViewState decode :"+decodeValue+"<br/>" );

[4] object viewstate = (new LosFormatter()).Deserialize( Request.Params["__VIEWSTATE"] );

[5] Response.Write( "ViewState Object :"+viewstate.GetType().Name );
}
加载更多回复(11)

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧