关于ViewState的一点疑惑

最近在看《ASP.NET 2.0服务器控件与组件开发高级编程》,其中有一个以前没有注意的细节,思索了好久,还是没有答案,还请各位帮忙指点一下。
服务器控件,注意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属性
   <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>
调用页面的后台代码,很简单
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)",到这里没有问题。
当我点击button提交,第二次请求页面时,我在调试器里发现再一次设置了CardholderNameText的值为"Full Name(Initialize)",但是页面却显示Name(After PostBack)",不知道怎么回事。
我怀疑是和Page的AddParseSubObject有关,因为它是在整个生命周期的最开始执行,会不会是此时的ViewState还没有生效?希望能给与解答!!谢谢
源代码附上CreditCardForm
原因:
结果和AddParseSubObject无关,原因实际很简单,怪自己看得不仔细,乱扣帽子,引用wit的回复
回传时,第一步任然解析html,并且设置CardholderNameText为:Full Name(Initialize),此时 视图里的值也为这个,因为该属性保存在视图里。

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

所以就是你的结果了···
posted @ 2008-05-20 11:34 BAsil 阅读(826) 评论(6)  编辑 收藏 所属分类: ASP.Net 2.0

  回复  引用  查看    
#1楼 2008-05-20 11:43 | Clingingboy      
当你on_load的时候你的试图状态已经更改为Full Name(After Postback)了
  回复  引用  查看    
#2楼 [楼主]2008-05-20 11:50 | BAsil      
@Clingingboy
我知道,我的意思是点击按钮的时候,页面中的属性设置又执行了,我是说这一句
<custom:CreditCardForm CardholderNameText="Full Name(Initialize)" runat="server" ID="creditcardform" />
为什么不会将Full Name(After Postback)的值冲掉?

  回复  引用    
#3楼 2008-05-20 12:08 | bossma [未注册用户]
关键是ViewState的状态在什么时候设置?可以找找加载的顺序看看
  回复  引用  查看    
#4楼 [楼主]2008-05-20 12:26 | BAsil      
大伙帮我分析分析阿
  回复  引用  查看    
#5楼 2008-05-20 13:29 | wit      
关于你的疑问,解答如下:

回传时,第一步任然解析html,并且设置CardholderNameText为:Full Name(Initialize),此时 视图里的值也为这个,因为该属性保存在视图里。

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

所以就是你的结果了···
  回复  引用  查看    
#6楼 [楼主]2008-05-20 14:18 | BAsil      
谢谢各位,很简单的问题被我搞复杂了,还是对生命周期不熟练阿,另外以后这种问题一定要调试进去,看一下,就比较容易弄懂了。下次一定注意阿!!

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-20 14:16 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: