最近在看《ASP.NET 2.0服务器控件与组件开发高级编程》,其中有一个以前没有注意的细节,思索了好久,还是没有答案,还请各位帮忙指点一下。
服务器控件,注意CardholderNameText是存到ViewState当中的
关于ViewState的一点疑惑    public class CreditCardForm : Control
    }
调用的页面,我放置了一个button,以便观察Postback的值是否发生改变,另外设置了CardholderNameText属性
关于ViewState的一点疑惑   <form id="form1" runat="server">
关于ViewState的一点疑惑    
<div>
关于ViewState的一点疑惑       
<custom:CreditCardForm CardholderNameText="Full Name(Initialize)" runat="server" ID="creditcardform" />
关于ViewState的一点疑惑        
<asp:Button ID="Button1" runat="server" Text="Button" /></div>
关于ViewState的一点疑惑    
</form>
调用页面的后台代码,很简单
关于ViewState的一点疑惑void Page_Load(object sender, EventArgs e)
  }
在页面第一次请求的时候,执行aspx编译生成的Page子类的AddParseSubObject,将控件加入到Controls集合中,并设置了CardholderNameText的值为"Full Name(Initialize)",由于是第一次加载在Page_Load中修改了值为"Full Name(After PostBack)",到这里没有问题。
当我点击button提交,第二次请求页面时,我在调试器里发现再一次设置了CardholderNameText的值为"Full Name(Initialize)",但是页面却显示Name(After PostBack)",不知道怎么回事。
我怀疑是和Page的AddParseSubObject有关,因为它是在整个生命周期的最开始执行,会不会是此时的ViewState还没有生效?希望能给与解答!!谢谢
源代码附上CreditCardForm
原因:
结果和AddParseSubObject无关,原因实际很简单,怪自己看得不仔细,乱扣帽子,引用wit的回复
回传时,第一步任然解析html,并且设置CardholderNameText为:Full Name(Initialize),此时 视图里的值也为这个,因为该属性保存在视图里。

下面就是重载视图了,会根据客户端form请求的值,重新加载视图状态,
这时就把第一次访问后的视图值加载过来(将Full Name(After Postback))

所以就是你的结果了···

相关文章: