asp.net的页面加载[转]

来源:互联网 发布:淘宝金酷娃玩具五十铃 编辑:程序博客网 时间:2024/05/20 03:07

在asp.net 中,当用户向aspx页面发出请求时,web服务器会交由asp.net引擎aspnet_isapi.dll来处理。asp.net引擎会先检查输出缓冲中是否有此页页面或者有此源代码,然后由编译器编译成dll文件。编译时asp.net引擎会从page类动态派生一个新类。如果此页面已经编译,择直接建立对象,处理事件,返回客户端浏览器;如果在输出缓冲中找到页面,则直接将输出缓冲中的内容返回到浏览器。
http协议是无状态的,asp.net通过把页面的状态封装到隐藏的输入域来维护状态信息。
asp.net 载入页面的时候触发下列事件:
page_init 页面初始化时触发,事件结束后,页面初始化完成。
page_load 页面载入且页面状态恢复后,触发此事件。
page_unload 页面从内存中释放时触发。

example:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)   //判断页面是否第一次加载
        {
            Label1.Text = " this is first access!";
        }
        else
        {
            Label1.Text = "page post back";
        }
    }
    protected void Page_Init(object sender, EventArgs e)
    {
        Label2.Text = "page init";
    }

页面加载后,先执行一次page_init ,然后执行page_load ,因为时第一次加载,所以ispostback 为假,所以 执行if语句里面的操作。

当页面上的控件进行提交,造成页面刷新的时候, page_init  不再加载,而page_load 再次执行,还是判断ispostback,这次执行的是else里面的语句。

前面谈到了aspx是使用viewstate来保存网页的状态。

网页第一次加载后:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTg1NjA5MDU3MQ9kFgICAw9kFgQCAQ8P
FgIeBFRleHQFFiB0aGlzIGlzIGZpcnN0IGFjY2VzcyFkZAIFDw8
WAh8ABQlwYWdlIGluaXRkZGQSd0DJn0GzjPC73T2o9IO517OL2Q==" />

控件产生事件,造成页面刷新后:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTg1NjA5MDU3MQ9kFgICAw9kFgQCAQ8P
FgIeBFRleHQFDnBhZ2UgcG9zdCBiYWNrZGQCBQ8PFgIfAAUJcG
FnZSBpbml0ZGRk7AoaK/qplWZEe7O8glpO8wpOuSY=" />

viewstate状态已经不一样了!

如果我们仅仅是按F5键对页面进行刷新,而不是因为控件的提交进行页面刷新,再次查看Source code.

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTg1NjA5MDU3MQ9kFgICAw9kFgQCAQ8P
FgIeBFRleHQFDnBhZ2UgcG9zdCBiYWNrZGQCBQ8PFgIfAAUJcG
FnZSBpbml0ZGRk7AoaK/qplWZEe7O8glpO8wpOuSY=" />

和上次的一样,所以单纯的页面刷新并不会改变网页的状态。

Tips:有时候在设计数据库程序时,不小心多刷新了一次页面,很可能造成数据库的重复插入新记录。

解决办法可以是--插入新记录成功后,立刻重定向本页到当前页面
也可以用一个session来保存前一个viewstate,和当前的viewstate做比较,如果一样,则不必进行数据的再次保存,表明网页没有变化。

原创粉丝点击