服务器控件,注意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))
所以就是你的结果了···