ASP.NET 2.0创建母版页引来的麻烦
核心提示:由于整体排版和设计的需要,我们常常创建母版页来实现全部网站的同1性,最近我由于同1性的需要,把原来全部项目单独的页面全部套用了母版页。但是出现了1个毛病……在这里记录1下,方便大家参考....
1、题目提出
由于整体排版和设计的需要,我们常常创建母版页来实现全部网站的同1性,最近我由于同1性的需要,把原来全部项目单独的页面全部套用了母版页。但是出现了1个毛病……在这里记录1下,方便大家参考。
2、抽象模型
由于全部页面内容过量,所以我把这个页面中最为本质的题目抽象出来。
原来单1页面,就是利用按钮触发JS事件,在文本域中插进“(_)”功能,实在现代码以下:
以下是援用片断:
以下为援用的内容: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> |
上述页面可以正常使用。后来使用模板页后,其代码以下:
以下是援用片断:
以下为援用的内容: <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" Title="使用母版页面抽象模型-YJingLee" %> |
当打开后按下按钮出现了“Microsoft JScript 运行时毛病: 'document.getElementById(...)' 为空或不是对象”。这是甚么缘由呢?原来好好的,怎样套用个母版页就出现这个希奇的题目呢?困扰了好久,和朋友讨论了1下,终究找到了答案……
3、分析本质
原来我们仔细看看其天生的HTML代码:
单1页面:
以下是援用片断:
以下为援用的内容: |
1 2 下1页
核心提示:由于整体排版和设计的需要,我们常常创建母版页来实现全部网站的同1性,最近我由于同1性的需要,把原来全部项目单独的页面全部套用了母版页。但是出现了1个毛病……在这里记录1下,方便大家参考....
再看看套用母版页以后,天生的HTML代码:
以下是援用片断:
以下为援用的内容:
|
是否是看到题目了,源文件控件元素的ID和天生HTML文件的ID不1致。表单from的name属性和id属性变成了aspnetForm,控件的id属性被平白无故了加上了ctl00_ContentPlaceHolder1_前缀,其name属性也加上了ctl00$ContentPlaceHolder1$前缀。
这下知道了,难怪提示“'document.getElementById(...)' 为空或不是对象”的毛病了,原来天生页面后其ID都变了。
那末我们如何解决它呢?既然他id变了,我们就把JS代码id改成天生后的id。代码以下:
以下是援用片断:
以下为援用的内容: function insert() { document.getElementById("ctl00$ContentPlaceHolder1$txt").value=document.getElementById("ctl00$ContentPlaceHolder1$txt").value+"(__)"; return; } //或 function insert() { document.getElementById("ctl00_ContentPlaceHolder1_txt").value=document.getElementById("ctl00_ContentPlaceHolder1_txt").value+"(__)"; return; } |
好了,题目解决了,不过想想有甚么更好的办法呢?到底为甚么呢?
实在分析1下,它是后来天生的客户端id,我们可以用C#语句Control的ClientID属性,像这样写:txt.ClientID; txt还是原来控件的id,后面的ClientID就是新天生的id。txt.ClientID是从程序里取到的后来天生新的id,这样不是更好吗。修改代码以下:
以下是援用片断:
以下为援用的内容: function insert() { document.getElementById("").value=document.getElementById("").value+"(__)"; return; } |
还有在后台Request.Form["txt"]键值需要改变,必须变成Request.Form[""]才能接收到页面的值。想想假设想要得到ID的control是1个用户控件的话,当天生页面后虽然能得到其ClientID,但是却得不到这个对象,所以也就不能设置或取得其属性了。比如,我要做的这个用户控件,由3个DropDownList组成,可是我却想得到1个完全的日期值(指在客户端),1种思路是先取得3个DropDownList的ClientID,然后再由ID1.value+ID2.value+ID3.value取得,可是假设你1个页面上需要放多个这样的用户控件的话,你需要取很多少个ClientID?明显这样做的话,工作量会很大,而且要操纵众多的对象,很轻易出错。
4、总结
这1类题目我像在我们编写程序时常常常常会碰到,总结1下:这应当属于“使用了MasterPage,或GridView中的模版列后所有元素ID不1致题目”。由于种种缘由(比如使用了MasterPage,或GridView中的模版列),1个控件在设计时的ID常常不同于天生页面后的ID,为了取得控件客户端ID,我们可以从天生的页面进手,取控件id有以下3种修改方法:(固然我还是推荐第3种)
以下是援用片断:
以下为援用的内容: document.getElementById("ctl00$编辑区ID$控件ID"); document.getElementById("ctl00_编辑区ID_控件ID"); document.getElementById(""); |
至于为甚么,是自己还没有深入理解其中的根源还是.NET机制题目呢?
在我们设计时常常就会出现1些莫名其妙的题目,我想我们碰到题目时,冷静思考,掌控主次,从底层框架进手,纠其缘由,相信终极会找到答案。
上1页 1 2 唐山网站建设www.fw8.netTAG:题目,控件,客户端,页面,片断
评论加载中...
|