再讨论webform内部运行机制,2次“到访”,要创建2个不同对象吗?

秋的红果实 2016-03-01 07:38:45
维护旧系统引发的疑问。如下简单代码,_Default .aspx.cs

namespace Test1
{
public partial class _Default : System.Web.UI.Page
{
string str;
protected void Page_Load(object sender, EventArgs e)
{
if(Page.IsPostBack)
{
return;
}
str = "ABCD";
}

protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(str);
}
}
}

运行后,点击button1,输出空白!
我想:用浏览器访问_Default.aspx,第一次“到访”服务器,服务器在内存建立_Default 的一个对象A(并使str==ABCD);点击button后回发页面,页面第二次“到访”服务器,此时,接待到访的还是先前那么对象A吗?还是创建一个新对象?

按照上面代码输出来推测,第二次应该是创建了新对象,但这实在不解,难道一个对象给客户端发送完数据后,就自动消失了?这个页面还可能“回访”它
...全文
166 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2016-03-03
  • 打赏
  • 举报
回复
大家再提供下这方面的资料链接吧,英文的也可以,尤其微软的最好,我自己没找到。 资料内容就是:从浏览器发起请求,到看到请求结果,这一过程的全部细节,越全面越好。忙完这阵子,打算彻底弄清楚这个过程
秋的红果实 2016-03-02
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
button有两种形式,一种是 submit形式,它通过上述 xxxchanged 模式来触发 click 事件。它还有一种非submit形式,它通过页面客户端唯一的 dopostback 形式来直接触发事件。 在第一趟处理 postdata 时,asp.net是来恢复上一次、输出 html 时所保存到 __ViewState 中状态数据,并且递归地恢复子控件的状态数据。然后第二趟,设置浏览器端post来的数据到控件,如果数据与第一趟恢复的数据不一样,准备在 page_Load 之后触发这些事件。接下来执行 Page_load 事件。接下来执行浏览器端通过 postback 参数传来的事件。 如果想学会 asp.net,那么最好的情况是你的老师能够结合 asp.net 的 System.Web.UI.Page 类的 ProcessRequestMain 方法和 System.Web.UI.Control 类的 AddedControl 的源代码来学习。比较次的,比如我这里没有时间没有精力,才能跟你说一点点原理。 如果你碰到连原理都不讲的 asp.net 入门书,那么趁早烧掉。
谢谢指导,我会找时间仔细研究微软文档的
秋的红果实 2016-03-02
  • 打赏
  • 举报
回复
引用 7 楼 hanjun0612 的回复:
正如楼上所属的,html是无状态的。 如果两次是同一个对象,也就不需要session和 viewstate了。 之所以以前说asp.net页面传输的数据大,就是因为他把所有的信息都回发。 这可以从侧面说明他不是同一个对象吗
我说的,和在浏览器看到的内容对应的对象(假设是viewPage)是不同的,我说的不是这个,而是_Default newObj=new _Default();里面的newObj,这两个是不同的,依据是newObj对象不会在自己页面添加如下之类内容 <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMzQyNDMzODE1D2QWAgIDD2Q …… 一定有第三个实体在组织数据,newObj只是提供了一部分数据而已,我是这么想的
正怒月神 2016-03-02
  • 打赏
  • 举报
回复
正如楼上所属的,html是无状态的。 如果两次是同一个对象,也就不需要session和 viewstate了。 之所以以前说asp.net页面传输的数据大,就是因为他把所有的信息都回发。 这可以从侧面说明他不是同一个对象吗
秋的红果实 2016-03-02
  • 打赏
  • 举报
回复
感谢楼上几位。 不过好像不是我要问的问题。每次看到的页面(html‘代码),当然都是新制造的,我要问的是这个制造者的问题 再叙述下,我自己想到的另类运行机制:

namespace Test1
{
    public partial class _Default : System.Web.UI.Page
    {
        string str;
        protected void Page_Load(object sender, EventArgs e)
        {
            if(Page.IsPostBack)
            {
                return;
            }
            str = "ABCD";
        }
 
        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write(str);
        }
    }
}

首先,_Default是一个类,运行后,需要_Default pageObj=new _Default();给str赋值ABCD,以及输出str,是由这个pageObj来执行的,那么,做完这些事,pageObj马上销毁了(?),如果是这样,点击button1,回发后,第二次到访IIS,此时需要_Default newObj=new _Default();(?),如果是这样,那么 (1)按照.net托管机制,对象由GC管理,适当时候销毁,不能马上销毁啊,假如如下代码(疑问在注解里)

string str="AAAA";
System.Threading.Thread.Sleep(3000);
response.write(str);  //挂起3分钟后,此时的str难道是重新建立的?不是上面的那个str了?
(2)很多人频繁访问的网站,服务器要不断new新对象吗? (3)两次是不同对象,有没有验证的例子?我的那个例子也许有其他解释
Poopaye 2016-03-02
  • 打赏
  • 举报
回复
引用 6 楼 From_TaiWan 的回复:
(1)按照.net托管机制,对象由GC管理,适当时候销毁,不能马上销毁啊,假如如下代码(疑问在注解里)

string str="AAAA";
System.Threading.Thread.Sleep(3000);
response.write(str);  //挂起3分钟后,此时的str难道是重新建立的?不是上面的那个str了?
(2)很多人频繁访问的网站,服务器要不断new新对象吗? (3)两次是不同对象,有没有验证的例子?我的那个例子也许有其他解释
1、那是3秒,不是3分钟 浏览器会在那边至少等3秒,才会显示AAAA 你可以把时间写长点,比如30000,测试下 2、是否需要new?反正有GC,对你而言没必要关心 3、你可以用静态字段保存几个对象试试
  • 打赏
  • 举报
回复
asp.net 是一个非常伟大的架构,它模拟了类似 winform 的编程体验——自动维系控件状态、并且自动触发响应用户操作的所有事件。它支持自定义控件、用户控件,不知道比 angularXX 的概念强大几百倍(可惜只是服务器端的机制)。 但是 asp.net 在比尔盖茨离开微软时就垃圾了,它不但没有跟上 web2.0 (或者说是 web2.0向 web3.0过渡)的浪潮,它只是扔了一个 jquery.js 到asp.net中,而且竟然去模拟 struts 了。实际上那个时候,经过2-3年比较虐心的论证,我们在2007年后认定 asp.net 淘汰了。 asp.net 彻底地扔掉了 web 前端技术。但是维护原来的那种一遍遍页面刷新的大系统(例如集团OA),你还是要理解 asp.net 的原理的。
  • 打赏
  • 举报
回复
button有两种形式,一种是 submit形式,它通过上述 xxxchanged 模式来触发 click 事件。它还有一种非submit形式,它通过页面客户端唯一的 dopostback 形式来直接触发事件。 在第一趟处理 postdata 时,asp.net是来恢复上一次、输出 html 时所保存到 __ViewState 中状态数据,并且递归地恢复子控件的状态数据。然后第二趟,设置浏览器端post来的数据到控件,如果数据与第一趟恢复的数据不一样,准备在 page_Load 之后触发这些事件。接下来执行 Page_load 事件。接下来执行浏览器端通过 postback 参数传来的事件。 如果想学会 asp.net,那么最好的情况是你的老师能够结合 asp.net 的 System.Web.UI.Page 类的 ProcessRequestMain 方法和 System.Web.UI.Control 类的 AddedControl 的源代码来学习。比较次的,比如我这里没有时间没有精力,才能跟你说一点点原理。 如果你碰到连原理都不讲的 asp.net 入门书,那么趁早烧掉。
  • 打赏
  • 举报
回复
引用 楼主 From_TaiWan 的回复:
维护旧系统引发的疑问。如下简单代码,_Default .aspx.cs

namespace Test1
{
    public partial class _Default : System.Web.UI.Page
    {
        string str;
        protected void Page_Load(object sender, EventArgs e)
        {
            if(Page.IsPostBack)
            {
                return;
            }
            str = "ABCD";
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write(str);
        }
    }
}
运行后,点击button1,输出空白! 我想:用浏览器访问_Default.aspx,第一次“到访”服务器,服务器在内存建立_Default 的一个对象A(并使str==ABCD);点击button后回发页面,页面第二次“到访”服务器,此时,接待到访的还是先前那么对象A吗?还是创建一个新对象?
没有学习过 asp.net 页面生命周期,那么你肯定就没有学过一点基本的 asp.net 理论,可能只是被动抄笔记而已。 每当收到一个浏览器端请求,asp.net系统都创建一个页面对象,然后将客户端传来的 __ViewState 用来填充控件的内部值、创建控件内部的嵌套控件,这个过程涉及的数据叫做postdata。填充 postdata之后,它再把浏览器端传来的post提交值更新到对应的控件(因为提交的值本身就是key-value对,其中key就是服务器端层级的ID),当发现不一样时,就准备好将来触发相应用间的 xxxChanged 事件(包括文本的Changed事件、DropdwonList的SelectedChanged、Button的Click等等,都是这类事件)。 在页面的 Page_load 事件触发之后,之前记录的这些事件就会逐一被触发。 这就是asp.net 页面生命周期中一部分重要的知识。这揭示了,asp.net每一次都重建新的页面类型对象,是新的!但是它可以自动恢复页面内的控件结构(例如 GridView 模板内部声明的复杂子控件结构),而且可以自动触发所有事件。 我不知道当今的所谓培训班还有几个真正能教你asp.net原理知识,因为我学习asp.net 是很早之前的事情了。但是我说的是最基本的知识
Poopaye 2016-03-01
  • 打赏
  • 举报
回复
html是无状态的,我想这个应该算是基础知识了 所以才有Session,Cookie,Form这些东西
tcmakebest 2016-03-01
  • 打赏
  • 举报
回复
事实胜于雄辩, 一次性的东东就是图个方便啊, 而且共用东西总是会存在各种矛盾,很难协调. 当然要记得上次的值也是有办法的
    string str = "123";
    ViewState["str"] = str;
    str = (string)ViewState["str"];

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧