当前位置:  编程技术>.net/c#/asp.net

asp.net创建母版页引来的麻烦

    来源: 互联网  发布时间:2014-08-30

    本文导语:  本文介绍一下 ASP.NET 2.0 在创建母版页时引来的麻烦,并分析了问题产生的实质。 一、问题提出   由于总体排版和设计的需要,我们往往创建母版页来实现整个网站的统一性,由于统一性的需要,把原来整个项目单独的页面...

本文介绍一下 ASP.NET 2.0 在创建母版页时引来的麻烦,并分析了问题产生的实质。

一、问题提出
  由于总体排版和设计的需要,我们往往创建母版页来实现整个网站的统一性,由于统一性的需要,把原来整个项目单独的页面全部套用了母版页。
    但是出现了一个错误。

二、 抽象模型
由于整个页面内容过多,所以把这个页面中最为本质的问题抽象出来。

原来单一页面,就是利用按钮触发JS事件,在文本域中插入“(_)”功能,其实现代码如下:




    单一页面抽象模型-YJingLee

// function insert() {
           document.getElementById("txt").value=document.getElementById("txt").value+"(__)";
        return;
}
// ]]>



   
   


       
       
       

   

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



// function insert() {
           document.getElementById("txt").value=document.getElementById("txt").value+"(__)";
        return;
}
// ]]>

   


       
       
       


  当打开后按下按钮出现了“Microsoft JScript 运行时错误: 'document.getElementById(...)' 为空或不是对象”。这是什么原因呢?原来好好的,怎么套用个母版页就出现这个奇怪的问题呢?

三、分析本质

原来我们仔细看看其生成的HTML代码:
单一页面:


    单一页面抽象模型-YJingLee

// function insert() {
     document.getElementById("txt").value=document.getElementById("txt").value+"(__)";
    return;
}
// ]]>



   




   

       
       
       


   



 
再看看套用母版页之后,生成的HTML代码:


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

   
     

       
    

  
        

// function insert() {
           document.getElementById("txt").value=document.getElementById("txt").value+"(__)";
        return;
}
// ]]>

   

       
       
       

   
    

   


  是不是看到问题了,源文件控件元素的ID和生成HTML文件的ID不一致。表单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;
  }

  好了,问题解决了,不过想想有什么更好的办法呢?到底为什么呢?

  其实分析一下,它是后来生成的客户端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是一个用户控件的话,当生成页面后尽管能得到其ClientID,但是却得不到这个对象,所以也就不能设置或获得其属性了。比如,我要做的这个用户控件,由三个DropDownList组成,可是我却想得到一个完整的日期值(指在客户端),一种思路是先获得三个DropDownList的ClientID,然后再由ID1.value+ID2.value+ID3.value取得,可是如果你一个页面上需要放多个这样的用户控件的话,你需要取得多少个ClientID?显然这样做的话,工作量会很大,而且要操作众多的对象,很容易出错。

  四、总结
  这类问题在编写程序时经常会遇到,这应该属于“使用了MasterPage,或者GridView中的模版列后所有元素ID不一致问题”。由于种种原因(比如使用了MasterPage,或者GridView中的模版列),一个控件在设计时的ID往往不同于生成页面后的ID,为了获得控件客户端ID,我们可以从生成的页面入手,取控件id有以下三种修改方法:(推荐第三种)
  document.getElementById("ctl00$编辑区ID$控件ID");
  document.getElementById("ctl00_编辑区ID_控件ID");
  document.getElementById("");


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 用JSP/ASP创建WAP应用
  • asp.net 动态创建控件的演示实例
  • asp.net 3.5中在web.config文件创建ACCESS连接字符串的方法
  • php或asp创建网页桌面快捷方式
  • asp.net 由于无法创建应用程序域,因此未能执行请求错误的解决方法
  • c# asp .net 动态创建sql数据库表的方法
  • asp.net创建位图生成验证图片类(验证码类)
  • ASP.NET之 Ajax相关知识介绍及组件图
  • 我想了解一些关于Java怎样与Asp或Asp.net结合方面在未来发展方向的问题?
  • c#/ASP.NET操作cookie(读写)代码示例
  • asp.net UrlEncode对应asp urlencode的处理方法
  • asp.net实例 定义和使用asp:AccessDataSource
  • win2008 r2 服务器环境配置(FTP/ASP/ASP.Net/PHP)
  • asp与asp.net的session共享
  • 如何在unix下发布asp?
  • 怎么让Apache支持Asp?
  • ??谁能把ASP代码改为JSP的
  • Linux平台下哪种方法实现ASP好?
  • ASP和ASP.Net共享Session解决办法
  • 通过socket和asp打交道
  • 犹豫中……,到底是选择ASP,还是JSP?
  • asp 是否 可用applet标签?帮忙!!
  • asp.net判断数据库表是否存在 asp.net修改表名的方法
  • 新人提问:asp+access的程序在linux下怎么改?
  • 用JAVA APPLET做的交互式网页和ASP、PHP做的相比有什么优势呢?
  • asp.net文字水印功能简单代码
  • asp里面可否使用java写的邮件,给30分.
  • asp与Jsp可否在iis中共存的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3