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