0


using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

public partial class test : BasePage {

    protected void Page_Load(object sender, EventArgs e) {
        Keywords += " mykey ";
    }
}

public class BasePage : System.Web.UI.Page {
    private HtmlMeta keywords = new HtmlMeta();

    public string Keywords {
        get { return keywords.Content; }
        set { keywords.Content = value; }
    }

    public BasePage() {

    }

    protected override void OnInit(EventArgs e) {
        keywords.Content = "key1,key2,key3";
        Header.Controls.Add(keywords);

        base.OnInit(e);
    }

}

内容就是这样子的...想写个基类.操作meta

如果页面发生postback事件,,发现keyword的值 变成 key1,key2,key3 mykey mykey 再发生一次 postback事件,,keyword的值变成 key1,key2,key3 mykey mykey mykey

我想知道的是...我不是在基类里. private HtmlMeta keywords = new HtmlMeta(); 这里不是重新new了吗 为什么还会存有原来的值呢?

垃圾帖?
提问于2009-01-03 13:51:43
143 2 5
添加评论
0


这个现象是由于ASP.NET的viewstate所导致的。 由于在代码中这个基类的KeyWords的值被存储在一个服务器控件(Header)中,因此在每次页面postback之后,页面会重新加载获得旧的header值。在继承页面的事件中,由于调用+=,会累加新旧值。因而看到的结果,是每次postback值都变了。

这里,了解asp.net页面事件模型和调用顺序也很重要,asp.net页面事件顺序和第一次postback之后情况是这样:

  1. Initialization
  2. LoadViewState(获得postback之前Header中的值:"key1,key2,key3")
  3. LoadPostbackData
  4. Load(修改了Keywords变量,Header中的新值变为:"key1,key2,key3 mykey ")
  5. RaisePostBackEvent
  6. SaveViewState(保存新的header视图状态,以便下次postback使用)
  7. Render (页面上显示新值)

MSDN有篇文章对于帮助理解viewstate很好: http://msdn.microsoft.com/zh-cn/library/ms972976(en-us).aspx

永久链接 | 垃圾帖?
回答于2009-01-03 14:37:42
348 2 10
添加评论




Made with Django.

当前版本: R-0127-20090523

cc-wiki