唐山网站建设

设为主页 加入收藏 繁體中文

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" %> 单1页面抽象模型-YJingLee

上述页面可以正常使用。后来使用模板页后,其代码以下:

以下是援用片断:

以下为援用的内容:
<%@ 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页面抽象模型-YJingLee

1 2 下1页

核心提示:由于整体排版和设计的需要,我们常常创建母版页来实现全部网站的同1性,最近我由于同1性的需要,把原来全部项目单独的页面全部套用了母版页。但是出现了1个毛病……在这里记录1下,方便大家参考....

再看看套用母版页以后,天生的HTML代码:

以下是援用片断:

以下为援用的内容:

使用母版页面抽象模型-YJingLee

        
    

是否是看到题目了,源文件控件元素的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.net
TAG:题目,控件,客户端,页面,片断
评论加载中...
内容:
评论者: 验证码: