MSDN上解释Page.FindControl(string id)方法用于查找指定ID的控件。例如:

<asp:TextBox id="Email" runat="server"></asp:TextBox>

TextBox txt = this.Page.FindControl("Email") as TextBox;
txt.Text = "abc@163.com";

该方法有点类似javascript中的getElementById(string)。但实际上,经过试验发现id这个参数并不是TextBox控件的ID,而是TextBox控件生成HTML代码后的name属性。如下代码:

<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>

其生成的HTML代码为:

<input name="TextBox1" type="text" id="TextBox1" />

我们看到,在默认情况下,控件TextBox的id属性对应生成后的input标签的id属性和name属性(id == name)。当有母版页存在的时候,情况就变得不一样了。当出现如下模板页时:

<asp:ContentPlaceHolder ID="BodyContent" runat="server"></asp:ContentPlaceHolder>
<asp:TextBox id="RealName" runat="server"></asp:TextBox>

生成的HTML变为了:<input name="ctl00$BodyContent$RealName" type="text" id="BodyContent_RealName" />

此时我们使用this.Page.FindControl("RealName"),系统会返回null。我们逐一尝试,this.Page.FindControl("BodyContent_RealName"),系统仍旧返回null。this.Page.FindControl("ctl00$BodyContent$RealName"),OK,正常了,天下太平了。

通过以上调试过程,我们发现Page.FindControl(string id)方法的id参数实质上是控件生成HTML代码后的name属性。默认情况下(没有模板页时),控件的ID属性会同时赋值给控件生成的对应html的标签的name和id属性。所以,此时Page.FindControl(string id)方法的id参数只要输入控件的ID属性即可。否则则需要输入控件生成HTML标签后的name属性。

通过如上代码,我们还发现在使用模板页时,控件的生成HTML标签后,对应的ID属性也变了,由"RealName"变为了"BodyContent_RealName"(模板页对应区域的ID+"_"+控件原来的ID)。无疑,这种ID不是很友好,给模板页的ContentPlaceHolder控件增加ClientIDMode="Static"属性后,可以解决这一问题:

<asp:ContentPlaceHolder ID="BodyContent" ClientIDMode="Static" runat="server"></asp:ContentPlaceHolder>
<asp:TextBox id="RealName" runat="server"></asp:TextBox>
<input name="ctl00$BodyContent$RealName" type="text" id="RealName">

我们发现,增加如上属性后,生成的HTML标签中,id属性保持了不变,但是name属性仍旧不太友好,聊胜于无吧,毕竟大多数时候我们使用js时都是使用getElementById(string)而不是使用getElementByTagName(string)

Page.FindControl(string id) 与母版页结合后发现的一个问题的更多相关文章

  1. SharePoint 2013 母版页修改后,无法添加应用程序

    原文:SharePoint 2013 母版页修改后,无法添加应用程序 问题描述:前一段时间尝试了一下将HTML文件转换为母版页,但是,用着用着又发现新的问题,我们转换的母版页,设置成默认母版页以后,无 ...

  2. yarn application ID 增长达到10000后

    Job, Task, and Task Attempt IDs In Hadoop 2, MapReduce job IDs are generated from YARN application I ...

  3. Getting NHibernate to generate a HiLo string ID

    We've got a large system that's loosely bound to its data source (Navision) via Unity - we're gettin ...

  4. 解决java.lang.NumberFormatException: For input string: "id"

    今天,项目突然报"java.lang.NumberFormatException:For input string:"id"",项目框架是spring,spri ...

  5. page = new String(request.getQueryString().getBytes("ISO-8859-1"),"GBK");解决前台传后台乱码问题

    page = new String(request.getQueryString().getBytes("ISO-8859-1"),"GBK");解决前台传后台 ...

  6. impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)

    impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)例如Query: select cast(round(2 / 3, 4)*100 as string)+-- ...

  7. POJ 1146 ID Codes 用字典序思想生成下一个排列组合

    ID Codes Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7644   Accepted: 4509 Descript ...

  8. jquery层级原则器(匹配前一个元素后的下一个元素,必须是挨着的)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 【React】dva-cli建立脚手架后发现页面样式不对的问题

    用dva-cli作为脚手架建立工程后,开始尝试编写页面.然后立马发现一个坑爹的问题. 在我less文件里面写了一个class ,比如:MainHead. 但是编译出来之后发现css文件里面变成了 Ma ...

随机推荐

  1. WPF Grid 用 C# 代码后台设置

    WPF Grid 用 C# 代码后台设置 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-21 参考: System.Wind ...

  2. resultset 记录数

    JDBC中的ResultSet API没有直接获取记录条数的方法,现介绍几个: 方法一:利用ResultSet的getRow方法来获得ResultSet的总行数 Java代码 ResultSet rs ...

  3. 【BZOJ3926】诸神眷顾的幻想乡 【广义后缀自动机】

    题意 给定一棵树,每个结点有一个颜色,问树上有多少种子串(定义子串为两点上路径颜色的序列).保证叶子结点<=20 分析 我们可以发现一个结论,任意一个子串一定是以某个叶子结点为根的trie的后缀 ...

  4. 670. Maximum Swap 允许交换一个数 求最大值

    [抄题]: Given a non-negative integer, you could swap two digits at most once to get the maximum valued ...

  5. 解决git无法clone地址为https的库

    一.问题描述 早上在学习<Spark快速大数据分析>的时候,需要下载书本的实例代码,于是用git clone一下给出的库: https://github.com/databricks/le ...

  6. Centos7 安装Nginx服务

    第一种方式:通过yum安装 直接通过 yum install nginx 肯定是不行的,因为yum没有nginx,所以首先把 nginx 的源加入 yum 中. 运行下面的命令: 1.将nginx放到 ...

  7. Cisco VPP启动流程

    Cisco VPP启动流程,有需要的朋友可以参考一下. VPP初始化 VLIB_INIT_FUNCTION用来定义构造函数,注册函数到vlib_main_t->init_function_reg ...

  8. Hive入门学习随笔(二)

    ====使用Load语句执行数据的导入 --将操作系统上的文件student01.txt数据导入到t2表中 load data local inpath '/root/data/student01.t ...

  9. Excel分类汇总与数据有效性

    分类汇总就是把一些数据按照一个标准进行分类,然后按照相应的汇总方式进行汇总. 使用分类汇总之前先排序,否则汇总会出现很多类. 看如上这个表,如果按照所属区域分类,然后按照金额的总和汇总,在汇总之前就要 ...

  10. [GO]匿名函数和defer

    package main import "fmt" func main() { a := 10 b := 20 defer func() { fmt.Printf("a ...