因为使用母版页而带来的麻烦

科研PPT制作母版篇 方法一:“视图” → “幻灯片母版” (不推荐,有点麻烦)方法二:快捷键 “shift” + 鼠标点击右下角“普通”视图标志 (推荐,一键进入母版! 阅读详情
 

本文将为大家介绍一下 ASP.NET 2.0 在创建母版页时引来的麻烦,并分析了问题产生的实质,大家在实际操作中多多注意一下。
  一、问题提出

  由于总体排版和设计的需要,我们往往创建母版页来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的页面全部套用了母版页。但是出现了一个错误……在我的Blog中记录一下,方便大家参考。

  二、 抽象模型

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

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

以下是引用片段:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>单一页面抽象模型-YJingLee</title>
<script language="javascript" type="text/javascript">
// <!CDATA[
function insert() {
document.getElementById("txt").value=document.getElementById("txt").value+"(__)";
return;
}
// ]]>
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<textarea id="txt" runat="server" name="txt" rows="10" cols="50"></textarea>
<asp:Button ID="btnInsert" runat="server" Text="服务器端插入(_)" OnClientClick="insert();"/>
<input id="btnInsert2" name="insert" onclick="insert();" type="button" value="客户端插入(_)" runat="server"/></div>
</form>
</body>
</html>
  

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

以下是引用片段:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" Title="使用母版页面抽象模型-YJingLee" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<script language="javascript" type="text/javascript">
// <!CDATA[
function insert() {
document.getElementById("txt").value=document.getElementById("txt").value+"(__)";
return;
}
// ]]>
</script>
<div>
<textarea id="txt" runat="server" name="txt" rows="10" cols="50"></textarea>
<asp:Button ID="btnInsert" runat="server" Text="服务器端插入(_)" OnClientClick="insert();"/>
<input id="btnInsert2" name="insert" onclick="insert();" type="button" value="客户端插入(_)" runat="server"/></div>
</asp:Content>


  当打开后按下按钮出现了“Microsoft JScript 运行时错误: 'document.getElementById(...)' 为空或不是对象”。这是什么原因呢?原来好好的,怎么套用个母版页就出现这个奇怪的问题呢?困扰了好久,和朋友讨论了一下,终于找到了答案……

  三、分析本质

  原来我们仔细看看其生成的HTML代码:

  单一页面:

以下是引用片段:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title> 单一页面抽象模型-YJingLee</title>
<script language="javascript" type="text/javascript">
// <!CDATA[
function insert() {
document.getElementById("txt").value=document.getElementById("txt").value+"(__)";
return;
}
// ]]>
</script>
</head>
<body>
<form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTEzMjE5NDA0NWRkKlEH1jSXJkIbnUaP2d9Dra8LQEk=" />
</div>
<div>
<textarea name="txt" id="txt" rows="10" cols="50"></textarea>
<input type="submit" name="btnInsert" value="服务器端插入(_)" onclick="insert();" id="btnInsert" />
<input name="btnInsert2" type="button" id="btnInsert2" onclick="insert();" value="客户端插入(_)" /></div>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBALVid/5DQKShrDCCQL5w9POBQL5w4vOBZPGqxUU/yvoKTqG8k+uG8YroGTv" />
</div></form>
</body>
</html>


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

以下是引用片段:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>使用母版页面抽象模型-YJingLee</title></head>
<body>
<form name="aspnetForm" method="post" action="Default2.aspx" id="aspnetForm">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTEwMTY2NjE0OWRkADUETiohcorj2qXOE9M1qhFVw20=" />
</div>
<div>
<script language="javascript" type="text/javascript">
// <!CDATA[
function insert() {
document.getElementById("txt").value=document.getElementById("txt").value+"(__)";
return;
}
// ]]>
</script>
<div>
<textarea name="ctl00ContentPlaceHolder1txt" id="ctl00_ContentPlaceHolder1_txt" rows="10" cols="50"></textarea>
<input type="submit" name="ctl00ContentPlaceHolder1btnInsert" value="服务器端插入(_)" onclick="insert();" id="ctl00_ContentPlaceHolder1_btnInsert" />
<input name="ctl00ContentPlaceHolder1btnInsert2" type="button" id="ctl00_ContentPlaceHolder1_btnInsert2" onclick="insert();" value="客户端插入(_)" /></div>
</div>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBAKyga4JAtO59ZELApOT2tEDApOTwvAC83bfMO00kt0PYcRte7XQOsXBcFE=" />
</div></form>
</body>
</html>


  是不是看到问题了,源文件控件元素的ID和生成HTML文件的ID不一致。表单from的name属性和id属性变成了aspnetForm,控件的id属性被无缘无故了加上了ctl00_ContentPlaceHolder1_前缀,其name属性也加上了ctl00ContentPlaceHolder1前缀。

  这下知道了,难怪提示“'document.getElementById(...)' 为空或不是对象”的错误了,原来生成页面后其ID都变了。

  那么我们如何解决它呢?既然他id变了,我们就把JS代码id改为生成后的id。代码如下:

以下是引用片段:
  function insert() {
  document.getElementById("ctl00ContentPlaceHolder1txt").value=document.getElementById("ctl00ContentPlaceHolder1txt").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("");


  至于为什么,是自己还没有深刻理解其中的根源还是.NET机制问题呢?

  在我们设计时往往就会出现一些莫名其妙的问题,我想我们遇到问题时,冷静思考,把握主次,从底层框架入手,纠其原因,相信最终会找到答案。

vue高德地图POI关键字搜索定位 最近在项目中遇到了关于地图的问题,首先为了满足需求从而使用的是JSAPI为2.0版本的。需求是根据关键字搜索定位到该位置。值得注意的是在使用 AMap.Event.addListener时 Event一定要大写的E,不然页面会报错。在地图上定义一个输入框,根据输入的位置进行提示,然后点击后跳转到对应的位置并打点标记。JSAPI主要使用这两个。 阅读详情

相关推荐

COMSOL中的动网格

首先我们先了解几个概念 (1)网格重划分(remesh):就是在某些特定的区域进行网格的重新划分,在Maxwell软件中的直线运动区域,当运动物体运动后,这个区域进行重新划分。 (2)morph:网格不重新划分,小范围的进行网格变形,针对运动物体运动位移较小,对变形区域不进行重划分,能够提高效率。 (3)网格滑移(sliding):针对圆形运动区域,运动与非运动区域进行网格滑移,当然边界上两侧网格不共节点,该方法不需要网格重新划分,大部分软件针对圆形运动区域采用该方法,比如maxwell的band,b

midiio的博客 7858

ASP.NET 2.0 创建母版页导致js出现“ 'document.getElementById(...)' 为空或不是对象”错误

本文将为大家介绍一下 ASP.NET 2.0 在创建母版页时引来的麻烦,并分析了问题产生的实质,大家在实际操作中多多注意一下。  一、问题提出  由于总体排版和设计的需要,我们往往创建母版页来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的页面全部套用了母版页。但是出现了一个错误……在我的Blog中记录一下,方便大家参考。  二、 抽象模型  由于整个页面内容过多

7143

如何使用apifox打包测试用例生成测试套件自动化执行

使用apifox打包测试用例生成测试套件自动化执行

weixin_55613512的博客 2877

JavaScript中document.getElementById()不起作用的原因,显示null

null不是错误 只是达不到预期可以把头部的script标签移动到底部 body标签上面如:我显示null的原因: 因为我把a页面的数据传到b页面输入框的placeholder属性(作为参考)然后我刚开始id显示null 是这样的 当时的代码是这样的:后来我把这段代码改成:

weixin_65740137的博客 956

视觉机器人抓取实战:从物体定位到抓取估计的完整流程解析(附Python代码示例)

本文详细解析了视觉引导机器人抓取的完整技术流程,涵盖从物体定位、位姿估计到抓取估计的核心步骤。通过Python代码示例,演示了如何使用Open3D等工具进行点云处理、平面分割、PCA与ICP位姿估计,以及基于几何启发式的抓取生成方法,为机器人视觉抓取开发提供了清晰的实战指南。

peach的博客 904

在 Ubuntu 22.04 上配置 SonarQube 与 CI/CD 流水线实现自动化代码审查

本文详细介绍了在Ubuntu 22.04系统上配置SonarQube并与CI/CD流水线集成的完整流程,实现自动化代码审查。从环境准备、数据库配置到核心参数调优,再到与Jenkins和GitHub Actions的深度集成,提供了实战技巧和性能优化建议,帮助团队提升代码质量监控效率。

weixin_28829325的博客 254

出现document.getElementById为空或不是对象的原因及解决方法

今天写一个JS代码,发现老出现“document.getElementById为空或不是对象”,经过多番求解,终于解决此问题,现将经验与源码爱好者网友分享。其实出现这种错误一般情况下不是JavaScript本身代码的问题,很多情况下,是由于你的疏忽而没有定义ID所致,检查的顺序应该是先内容后js。 1.出现 'null’为空或不是对象的情况: 2.出现document.getElementById...

weixin_43079157的博客 6242

别再乱改宏定义了!STM32F103程序移植保姆级教程(从C8T6到ZET6实战)

本文详细解析了STM32F103程序从C8T6移植到ZET6的实战步骤,重点介绍了硬件差异、开发环境配置、时钟陷阱及外设处理等关键点。通过修改宏定义(如STM32F10X_HD)、调整启动文件和时钟配置,确保移植顺利进行。适合嵌入式开发者参考,避免常见移植问题。

weixin_42567497的博客 212

"getElementsByClassName is not a function" 报错原因

element.getElementsByClassName(""): 返回的含有该类的子元素数组,除了子元素以外的后代元素是获取不到的。要遍历使用,或者.element.getElementsByClassName("")[0]; 这样的方式获取元素。 document.getElementsByClassName: 这个才会返回含有该类的后代元素。 见MDN对el...

bangpu6497的博客 5232

CSP-J 复试考点

可以用来训练思维,对于学习时间短的同学,动态规划可以帮助你迅速进入编程状态,也有助于帮你发现题目背后可能隐藏的更简便的算法。动态规划、贪心都是和子问题相关的,动态规划的基本思想是将一个大的问题划分成子问题,接着分别求解,而且能够将一些重复的计算记忆化,大大提高效率。难度加大,会涉及到二分、动态规划之类的算法,容易遗漏考虑点,不易得全分,考试的时候要注意全面性。一般是压轴题,算法不明显,剪枝的搜索、动态规划、状压 DP、树形 DP 、树、图等。枚举算法是指,列举出所有可能的取值,从中找出最优解。

GuanHeTian的博客 2197

AutoSAR配置与实践(基础篇)3.2 BSW中的I/O架构和模块详解

车门位置传感器(Sensor SWC)输出的电流信号经过了一系列处理,如先被转化为电压信号,后又经ADC转换为数字信号,但是IoHwAb模块对上层隐藏了这一系列处理过程,并将数据直接抽象为它的输出接口,即车门开关状态接口。Sensor SWC 使用RTE接口直接从IoHwAb模块封装的车门开关状态,SWC它并不关心ECU硬件是如何实现的传感器电流采集,也不关心MCU ADC采样精度(如10/12位)IoHwAb把采集的电压抽象为开关状态,使得Sensor SWC不依赖具体的ECU硬件。

nihaoljq2010的博客 1296

Uncaught TypeError:getElementsByClassName is not a function。

学习JS中总会遇到奇奇怪怪的问题,为了节约时间,百度一下是不二选择。 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>颜色测试(runoob.com)</title> </head> <body> <...

llussize的博客 9807

YOLO11涨点优化:注意力魔改 | 引入Deformable Attention (可变形注意力),灵活感受野自适应复杂形变目标

Deformable Attention为YOLO11带来的不仅是2.6个百分点的mAP提升,更是一种全新的“形变感知”范式。标准卷积的固定感受野在非刚性目标、多尺度变化和遮挡场景下力不从心——Deformable Attention恰好填补了这一空白。从架构设计到代码实现,从竞品对比到部署方案,从生态工具到安全风险,本文覆盖了将Deformable Attention引入YOLO11所需的全部知识链路。

2601_95807009的博客 279

MasterPage(母版页)

介绍 母版页(MasterPage)就相当于模板页,挺简单的,没什么好说的。基于母版页的常用的功能有:母版页和内容页之间信息的传递,在内容页中用FindControl方法找到内容页中的控件等。另外,母版页是可以嵌套的。 关键 在内容页的头部加上母版页的强类型引用

anchenyanyue的专栏 1043

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Blazor —— 母版页的定义和使用(Layout)

母版页在项目中那是必然要用的功能,那你咋知道怎么定义和使用吗?

不忘初心 4533

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Asp.net母版页编程

一直都觉得Asp.net的母版页就是个Bug般的存在,简化UI编程、使得某些通用编程成为可能。 母版页主要实现方式是通过ContentPlaceHolder与Content配合来作用的,待会的后台编程也会体现这点。一般在内容页中要指明它引用的母版页(设置MasterPageFi

DeathSteps的专栏 687

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

如何使用ASP.NET母版页统一网页标题

一个网站的时候需要将所有的标题的格式统一起来,比如将所有网页的标题统一为“XX页面 | XX网站”。   zenoven在用VS2005做的时候开始没用母版页,后来用母版页的时候发现改内容页的标题其实挺麻烦的,因为每个内容页都要设置标题,而每个标题中都要有网站的名字。如果手工给每个内容页加上该内容页的标题,再加上网站名字,岂不是很麻烦?好在我们用的是动态语言,至少网站名字可以在母版页中直接统一起

Sky 的专栏 2230

运用母版页时的链接问题

在母版页中使用相对URL必须十分小心,例如在母版页中添加图片和链接时。根据所使用的是HTML标签还是ASP.NET控件,相对URL就会有不同的解析方式。 如果使用ASP.NET控件,相对URL会解析为相对于母版页的URL。以下的代码用来在母版页中添加ASP.NET Image控件: <asp:ImageImageUrl="Picture.gif"Runat="Server"...

anjujiao1678的博客 356

浅析 母版页和ifarme 之间的区别

用母版页 Content内容随便写啊 和普通页没什么区别  而用iframe来写 再用target=""来引入需要的页面 不也一个意思吗  两者其实是有区别的。有人问起过这个问题,两者看起来也差不多,刚开始后,我以为母版页是微软简单地包装了ifame而已,后来,使用了母版页之后,才发现两者还是有很大区别的。第一,母板页是微软在vs2005版本推出之后就出现的,还算得上是

2022

使用母版页

使用母版页左直拳早在二年前使用ASP。NET1。1的时候,面对许许多多风格、控件位置摆放非常相似的页面,总在做着拷贝、粘贴、修改的工作,虽然已经尽量使用用户控件,但还是有相当多重复的代码。我就想:“如果可以搞个自定义的页面基类,上面定好一些常用的样式、控件,以后创建新页就从基类派生该有多好”。可是一直没有实现该功能,或者说,是没有这样做过。人就是这样奇怪,明知道某件事是很好的,可总提不

左直拳的马桶_日用桶 2188

ASP.NET使用母版页统一网页标题

<br />在做网页的时候给每个网页设置一个合理的标题是很有必要的事情,而做一个网站的时候需要将所有的标题的格式统一起来,比如将所有网页的标题统一为“XX页面 | XX网站”。<br />zenoven在用VS2005做的时候开始没用母版页,后来用母版页的时候发现改内容页的标题其实挺麻烦的,因为每个内容页都要设置标题,而每个标题中都要有网站的名字。如果手工给每个内容页加上该内容页的标题,再加上网站名字,岂不是很麻烦?好在我们用的是动态语言,至少网站名字可以在母版页中直接统一起来。<br />下面说下我用的两

透明阁 1614

Web母版制作和母版嵌套

母版是网页制作中很重要的一部分,它可以大大节省web开发的过程,避免过多重复性的制作过程;而母版嵌套是在沿用母版的基础上进一步进行格式化的方法。

一支穿云箭 6157

ASP.NET 2.0 创建母版页引来的麻烦

本文将为大家介绍一下 ASP.NET 2.0 在创建母版页时引来的麻烦,并分析了问题产生的实质,大家在实际操作中多多注意一下。  一、问题提出  由于总体排版和设计的需要,我们往往创建母版页来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的页面全部套用了母版页。但是出现了一个错误……在我的Blog中记录一下,方便大家参考。   二、 抽象模型   由于整个

studio4的专栏 236

Moss 之五母版页 布局页 Features[转贴]

如果一个网站有很多页面,而这些页面需要一致的外观和样式时,可能对于程序设计人员来说,需要重复的一些工作,开发维护都比较麻烦。 MOSS2007中引人注目的一项功能就是web内容管理(Web Content Management),用户可以更换母版页(Master Page)、改变页面布局以及完全自定义母版页面等,MasterPage是ASP.NET2.0中管理页面统一布局的机制,在MOSS200

maxingge89的专栏 761

在内容页中调用母版页控件 一些方法总结

总结来源百度贴吧 在内容页中调用母版页控件 在内容页中有个属性Master,可以通过它访问母版页。如我们要修改母版页上的标题,我们看到显示标题的那个Label的ID为Label1,在Page_Load事件中增加以下代码: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) ((Label)Master.Fi

世上无难事,只怕有心人 1万+
上一篇: char、varchar、text和nchar、nvarchar、ntext
下一篇: System.Web.Mvc.UrlHelper的学习与使用
meimingming
博客等级 码龄17年 46粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值