当前位置:编程学习 > C#/ASP.NET >>

刚接触asp.net,问一下代码的执行顺序。


<html>
<head>
    <script language="C#" runat="server">
        void Page_Load(Object Src, EventArgs E) {
            if (!Page.IsPostBack) {
               ArrayList values = new ArrayList();
               values.Add (0);
               values.Add (1);
               values.Add (2);
               values.Add (3);
               values.Add (4);
               values.Add (5);
               values.Add (6);
               DataList1.DataSource = values;
               DataList1.DataBind();
            }
        }
        String EvenOrOdd(int number) {
            if ((number % 2) == 0)
              return "偶数";
            else
              return "奇数";
        }
    </script>
</head>
<body>
  <h3><font face="宋体">到方法和表达式的数据绑定</font></h3>
  <form runat=server>
    <asp:DataList id="DataList1" runat="server"
      BorderColor="black"
      BorderWidth="1"
      GridLines="Both"
      CellPadding="3"
      CellSpacing="0"
      >
      <ItemTemplate>
       数字值:<%# Container.DataItem %><%--Container表示数据源--%>
       偶/奇:<%# EvenOrOdd((int) Container.DataItem) %><%--绑定到函数返回值--%>
      </ItemTemplate>
    </asp:datalist>
  </form>
</body>
</html>

请问高手:脚本中的Page_Load与cs中的Page_Load的执行顺序哪个先执行? <ItemTemplate>
中的代码与脚本中的Page_Load哪个先执行?上面的代码执行顺序是怎么样的?请高手依次回答,谢谢。 --------------------编程问答-------------------- 当然是脚本了。 --------------------编程问答--------------------
引用 1 楼 smilling_candy 的回复:
当然是脚本了。

javascipt会在dom加载完执行吧? --------------------编程问答-------------------- 你哪里有“cs中的Page_Load”?

页面的page_load先执行,然后执行控件的page_load。来看看sap.net源代码:
internal virtual void LoadRecursive()
{
    if (this._controlState < ControlState.Loaded)
    {
        if (this.AdapterInternal != null)
        {
            this.AdapterInternal.OnLoad(EventArgs.Empty);
        }
        else
        {
            this.OnLoad(EventArgs.Empty);
        }
    }
    if (this._controls != null)
    {
        string errorMsg = this._controls.SetCollectionReadOnly("Parent_collections_readonly");
        int count = this._controls.Count;
        for (int i = 0; i < count; i++)
        {
            this._controls[i].LoadRecursive();
        }
        this._controls.SetCollectionReadOnly(errorMsg);
    }
    if (this._controlState < ControlState.Loaded)
    {
        this._controlState = ControlState.Loaded;
    }
}
你可以看到,先执行“this.OnLoad(EventArgs.Empty);”,然后遍历Controls里边的子控件并递归调用自身方法。 --------------------编程问答--------------------
引用 1 楼 smilling_candy 的回复:
当然是脚本了。


它的<script>有个属性runat="server",这个<script>根本不输出到浏览器端。 --------------------编程问答--------------------
引用 4 楼 sp1234 的回复:
它的<script>有个属性runat="server",这个<script>根本不输出到浏览器端。

我上面的代码 Page_Load是最先执行吧,然后是依次执行body标签中的代码吧? --------------------编程问答-------------------- “依次执行body标签中的代码”

我不懂这句话是什么意思。当asp.net编译这个页面,它就在所自动生的代码class中已经将所有内容都生成为服务器控件了。例如你的代码中,首先是一个LiteralControl控件,它的text内容就是<h3 />整个部分的字符串,然后是一个Form控件,这个Form控件内部的Controls集合中又包含一个DataList控件,这个DataList控件的ItemTeplace属性又包含另外一个自动生成的模板对象,这个模板对象里边又会动态为模板对象的宿主对象来产生一项项内容......

总之整个body内部的东西都预先编译为代码,而且在页面对象实例化时会动态创建出来。所以当asp.net处理这个页面的page_load,所有控件早就创建了,只不过是递归地调用它们的page_load而已。 --------------------编程问答-------------------- 哎,都是前台后台搞不清楚的结果,
或者说是对ASP程序的工作原理不清楚的结果....

一个缺乏基础知识而导致的问题,
很难从面上简单说清楚, --------------------编程问答-------------------- <script language="C#" runat="server">

这个写法也是第一次见到,
我算是孤陋寡闻了.... --------------------编程问答-------------------- 脚本先执行 --------------------编程问答-------------------- 例如你的代码中,首先是一个LiteralControl控件.....

嗯,实际上我这里遗漏了。按照lz的设计代码来看,在asp.net解析到body之前,还会在LiteralControl类型的控件之前首先插入HtmlHead类型控件。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,