ASP.NET4.0中客户端ID的生成

来源:互联网 发布:汽车维修管理系统源码 编辑:程序博客网 时间:2024/05/01 00:04

       从去年某个时候,我开始探索ASP.NET4.0 Web窗体的改进。我发现ASP.NET4.0中一些令人兴奋地改进,我确认这一切都会使WEB开发更简单并为我们提供更多灵活性。因此我逐个摘选了这些很令人兴奋地ASP.NET4.0特性。早些时候,我写得对于URL路由的文章,你可以通过点击下面链接查看。
       ASP.NET 4.0中的URL路由

       如标题所述,你知道这儿我要讨论,我们如何控制ASP.NET 4.0中ASP.NET服务器控件客户端ID的生成。早些时候,这个客户端ID对我来说是另外一件神秘的事情,但是后来我发现了.NET引擎生成服务器端控件ID的算法。

       环境:
       Visual Studio 2010

       为什么是客户端ID:
       客户端ID经常是个问题,特别是现在,新时代的应用程序中,我们更偏向于丰富互联网应用程序的客户端编程。在过去的几年里,已经形成像JQuery、JSON、DOJO等创建比较丰富的UI的许多技术和编程方法。

       在DOM中,要访问的控件的客户端ID扮演者重要的角色。因此微软也通过提供能够确保更简单和更少错误的RIA开发的控制客户端ID生成的功能,试图让我们的编程生活更简单。

       之前版本的客户端ID:
       让我讨论一下,早期版本中客户端ID是如何生成的。

       首先,我从标准控件TextBox或Label开始说起。这儿生成的客户端ID,前缀以 用下划线分割的 自上而下的所有的命名容器为前缀。这确实是一个在客户端生成唯一ID的好主意。但是正如我讨论的,客户端ID是新时期应用程序开发的重要组成部分。看一下一个简单的TextBox服务器控件的例子:
Brij_634099931410072031_normal35aspx.jpg


       从上面的图片我们可以看到,我的Label和TextBox是在一个contentplaceholder里面,接着看一下客户端ID:
Brij_634099931410863047_normalpage3.5.jpg



       现在这儿的客户端ID是ctl00_ContentPlaceHolder1_myTextBox。如果我们从ctl00开始一个一个的数(以下划线为分隔符),下一个是contentplaceholder的ID,再下一个是TextBox的ID。

       值得注意的一点是,当你移动控件到其它位置时,客户端ID会自动改变。

       虽然我们知道页面会生成唯一的ID,但是你必须不让任何控件超出页面的控制范围。.NET引擎会根据她的算法为你自动生成客户端ID。

       现在,让我们来谈谈一些数据控件,如GridView、ListView、DropDownList等。用这些控件做什么?我们只给控件绑定数据源。在运行时,基于此数据,控件行被自动生成。关于这儿的客户端ID呢?客户端ID如我们已经讨论的方法一样,自动生成,并且前缀带有行号。看一看这个示例。

       我的aspx中的GridView代码。这儿我显示了ID、BookName和Price。
Brij_634099944294876719_dataaspx35.jpg


       上面例子中,我使用了一个GridView。在GridView中的不同模板列中有三个Label。GridView在contentplaceholder中。看一下客户端ID:
Brij_634099931409554453_datapage35.jpg



       你可以看到像ctl00_ContentPlaceHolder1_gridviewBooks_ctl02_lblID这样的ID,由.NET引擎按序列生成前缀,后面加Label的ID。

       这种ID非常不易用。

       随着新时期WEB开发的发展,在WEB开发中,当你在客户端做大量工作的时候,客户端ID成为重要组成部分。

       ASP.NET 4.0中控件的客户端ID的生成
       ASP.NET 4.0中提供了有效地方法控制客户端ID的生成。ASP.NET 4.0中提供一个新的属性ClientIDMode用于处理控件客户端ID的生成,这个属性使得我们可以自定义如何生成控件的客户端ID,ClientIDMode提供四个选项:
       * AutoID
       * Static
       * Predictable
       * Inherit

       我们一个一个的来讨论。

       AutoID:这个属性的功能和之前.NET版本生成客户端ID的功能相同。如果你不想改变之前版本的客户端ID生成的功能,就指定这个值。

       Static:意味着你想控件有一个静态的ID。当你知道控件的ID在页面中唯一的时候,你应该改使用这个选项。.NET引擎会生成相同的客户端ID而不会添加任何后缀或前缀。这种模式主要用于标准的单个控件。看一下例子.

Brij_634099931410443125_normalaspx4.jpg



       在上图中你看到,我设置Label的ClientIDMode为AutoID,设置TextBox的为Static。现在让我们看一下生成的客户端ID.
Brij_634099931624398203_normalpage4.jpg


       你看到Label的客户端ID和之前版本相同是因为我设置ClientIDMode的值为Auto.

       但对于TextBox,我设置为Static,所以其客户端ID跟我们在aspx页面中设置的一样。这就是ASP.NET4.0之美。如果我们设置为Static,.NET引擎直接使用控件的ID作为客户端ID,而不会生成新的客户端ID。

       Note:有一点需要注意,如果我们设置的模式是Static而页面中确没有相同客户端ID的控件,是因为页面中有相同客户端ID的控件。这可能是灾难性的,当我们从客户端访问的时候。

       Predictable:这是另外一个我喜欢的客户端ID生成模式。当你确实不能确定ID在页面中是否唯一的时候,那么你可以用这个选项。这个值允许我们预测呈现页面中的客户端ID。当你设置为此选项时,你需要根据你自己的选择设置更多的属性。

       我把上面的例子的aspx代码修改如下:
Brij_6340999314098181251_gridviewaspx4.jpg


       由于我们用了数据控件,这样的话,我们不能设置选项为Static,因为基于此数据将生成多个控件(每行数据一个)。

       我们使用模式Predictable以便我们可以预测控件的ID将会是什么。我们需要多设置一个ClientIDRowSuffix属性,我设置其值为ID列的值。

       看看得到的客户端ID
Brij_634099931409232188_datapage4.jpg



       我们看控件的客户端ID是MainContent_gridviewBooks_lblName_1。如果看得更深入一点,我们发现根本没有计数器这回事。第一个是contentplaceholder的ID,接下来是GridView的ID,再下来是Label的ID,后缀ID是我们设置的。

       Inherit: 控件ID的生成将和父控件相同。这个是控件的默认选项。

       设置各级属性

       有很多地方我们可以设置ClientIDMode属性。可以是控件级别或页面级别或应用程序级别。结果是一样的。我们可以像下面那样设置页面指令:
Brij_634099931624788828_Pagelevel.jpg


       要设置应用程序级的,需要在配置文件中设置,设置将被应用到应用程序中的所有页面:
Brij_634099931408040781_Applevel.jpg



翻译辛苦,转载请注明出处。