浅谈Asp.Net母版页的相关知识(2)

在运行的时候回发现有错误,错误的内容是“无法实现循环引用”。这是因为默认在子页面中引用了母版页,你也就不能再在母版页中引用子页面了。

我在网上也没找到更好的解决方法,但这使我们想起C#是的“反射”,它可以使我们动态获取页面对象,并且可以调用它的属性和方法。

代码如下:

Type t = this.ContentPlaceHolder1.Page.GetType(); PropertyInfo pi = t.GetProperty(“ContentValue”); //获取ContentValue属性 pi.SetValue(this.ContentPlaceHolder1.Page,this.txtMaster.Text,null); //给属性赋值 MethodInfo mi = t.GetMethod(“SetValue”); //获取SetValue()方法 object[] os = new object[1]; //建造输入参数 os[0] = txtMaster.Text; mi.Invoke(this.ContentPlaceHolder1.Page, os); //调用SetValue方法

七、在有多个内容页面使用母版面的情况下,在母版页中根据不同的内容页面实现不同的操作

在母版页中可以加入多个不同的内容页面,但在设计期间,我们无法知道当前运行的是哪个内容页面。所以只能通过分支判断当前运行的是哪个子页面,来执行不同的操作。这里也用到了反射的知识。

代码如下:

string s = this.ContentPlaceHolder1.Page.GetType().ToString(); //取出内容页面的类型名称 if (s == “ASP.default17_aspx”) //根据不同的内容页面类型执行不同的操作 { ((TextBox)this.ContentPlaceHolder1.FindControl(“TextBox2″)).Text = “MastPage”; } else if (s == “ASP.default18_aspx”) { ((TextBox)this.ContentPlaceHolder1.FindControl(“TextBox2″)).Text = “Hello MastPage”; }

八、在母版面与内容页面中JS代码的操作

在母版页或内容页面中的控件运行之后会自动生成ID,如文本框的ID是txtContent1,在运行之后ID会自动变为ctl00_ContentPlaceHolder2_txtContent1,name属性会变为ctl00$ContentPlaceHolder2$txtContent1。

在JS代码中,我们用document.getElementById()方法,根据id取得控件对象的时候,应当使用ctl00_ContentPlaceHolder2_txtContent1这个ID名,否则会产生“未找到对象”的异常。

母版页运行机制

母版页仅仅是一个页面模板,单独的母版页是不能被用户所访问的。单独的内容页也不能够使用。母版页和内容页有着严格对应关系。母版页中包含多少个ContentPlaceHolder控件,那么内容页中也必须设置与其相对应的Content控件。当客户端浏览器向服务器发出请求,要求浏览某个内容页面时,ASP.NET引擎将同时执行内容页和母版页的代码,并将最终结果发送给客户端浏览器。

母版页和内容页的运行过程可以概括为以下5个步骤。

(1)用户通过键入内容页的URL来请求某页。

(2)获取内容页后,读取@ Page指令。如果该指令引用一个母版页,则也读取该母版页。如果是第一次请求这两个页,则两个页都要进行编译。

(3)母版页合并到内容页的控件树中。

(4)各个Content控件的内容合并到母版页中相应的ContentPlaceHolder控件中。

(5)呈现得到结果页。

母版页和内容页事件顺序

(1)母版页中控件Init事件;

(2)内容页中Content控件Init事件;

(3)母版页Init事件;

(4)内容页Init事件;

(5)内容页Load事件;

(6)母版页Load事件;

(7)内容页中Content控件Load事件;

(8)内容页PreRender事件;

(9)母版页PreRender事件;

(10)母版页控件PreRender事件。

(11)内容页中Content控件PreRender事件。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsfyj.html