65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ASP.NET 4.0 生成客户端 ID

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (34投票s)

2010年9月11日

CPOL

7分钟阅读

viewsIcon

96457

本文讨论了 ASP.NET 4.0 的一项新功能“客户端 ID 生成”。

目录

引言

最近几天,我开始探索 **ASP.NET 4.0 Web Forms 的增强功能**。我发现 ASP.NET 4.0 中有一些令人兴奋的增强功能,并且确信这些都将使 Web 开发变得更简单,并为我们提供**更大的灵活性**。因此,我开始逐个挑选 ASP.NET 4.0 中最令人兴奋的功能。之前,我写了关于**URL 路由**的文章,您可以通过下面的链接进行阅读。

顾名思义,在这里我将讨论如何在 **ASP.NET 4.0** 中控制 ASP.NET 服务器控件的客户端 ID 的生成。这个客户端 ID 以前对我来说也是一个谜,但后来我识别出了 .NET 引擎用于为服务器控件生成客户端 ID 的算法,但它们一直不够用户友好。

先决条件

  • Visual Studio 2010

为什么需要客户端 ID

客户端 ID 一直是我们的一个问题。但如今,在新一代应用程序中,我们越来越多地转向客户端编程,转向新的富 Internet 应用程序。在过去的几年里,已经出现了许多新的技术和编程方式,可以实现非常丰富的 UI,例如 JQuery、JSon、Dojo。

在 DOM 中,要访问一个控件,客户端 ID 起着至关重要的作用。因此,微软也正在努力通过提供控制客户端 ID 生成的能力来使我们的生活更轻松,这将确保简单、便捷且不易出错的 RIA 开发。

以前的客户端 ID

那么,让我们来讨论一下以前是如何生成客户端 ID 的。首先,我将从普通控件开始,例如 `textbox` 控件或 `label`。在这种情况下,生成的客户端 ID 以所有命名容器从上到下的前缀开头,并用下划线分隔。实际上,这是一个在客户端生成唯一 ID 的好方法。但是正如我所讨论的,客户端 ID 是新一代开发的关键部分。让我们来看一个简单的文本框服务器控件的示例。我的 aspx 代码如下:

Normal Page

图:普通页面

从上图可以看出,我的 label 和 textbox 位于 `contentplaceholder` 中。现在,让我们看看 `ClientId`。

View Source - Normal Page

图:查看源 - 普通页面

这里的客户端 ID 是 `ctl00_ContentPlaceHolder1_myTextBox`。如果我们逐个分析,`ctl00` 是计数器,下一个是 `contentplaceholder` 的 ID,再下一个是 `textbox` 的 ID。

所以,你移动控件到其他位置时,客户端 ID 也会随之改变。

因此,虽然我们知道 ID 在页面上是唯一的,但您仍然无法控制它Frown。(.NET 引擎会按照其算法为您生成客户端 ID)。

以上就是关于简单控件的内容。现在我们来谈谈**一些数据控件**,例如 `gridview`、`listview`、`dropdown` 等。在这些控件中,我们所做的是将数据源绑定到控件。在运行时,根据数据生成行数(控件)。那么这里的客户端 ID 是什么呢?这里,客户端 ID 的生成方式与我上面讨论的相同,即以行号作为前缀。那么,让我们来看一个例子。

这是我的 `GridView` 的 aspx 代码。我在这里显示 ID、书名和价格。

Page with data control

图:带数据控件的页面

在上例中,我使用了一个 `gridview`。在这个 `gridview` 中,我在不同的 `ItemTemplates` 中有三个标签。`gridview` 位于 `contentplaceholder` 中。

现在看看客户端 ID。

View Source - Page with data control

图:查看源 - 带数据控件的页面

您可以看到 ID 类似于 `ctl00_ContentPlaceHolder1_gridviewBooks_ctl02_lblID`。如果逐个分析,首先是计数器,然后是 `contentplaceholder` ID,然后是 .NET 引擎为每一行生成的 `rowcounter` 以确保唯一性,最后是 label ID。

这使得使用起来非常不方便。

但是,在新时代的 Web 开发中,当我们进行大量客户端工作时,客户端 ID 成为 Web 开发的关键部分。

使用 ASP.NET 4.0 控制客户端 ID 的生成

ASP.NET 4.0 提供了控制客户端 ID 生成的功能。为此,它提供了新的 `ClientIDMode` 属性来处理这个问题。此属性使我们能够指定客户端 ID 的生成方式。它提供了四种选项:

  • AutoID
  • 静态
  • Predictable (可预测)
  • Inherit (继承)

我们将逐一讨论它们。

AutoID:此属性与早期版本的 .NET 相同。如果您不希望在客户端 ID 生成方面有任何变化,请指定此值,正如我在早期版本的 ClientIDs 中所讨论的那样。

Static:这意味着您想要控件的静态 ID。当您知道 ID 在页面上是唯一时,应使用此属性。在这种情况下,.NET 引擎将按原样生成客户端 ID,而不添加任何后缀或前缀。此模式主要用于普通单个控件。让我们来看一个例子。

Normal page with ASP.NET 4.0

图:使用 ASP.NET 4.0 的普通页面

在图片中,我为 Label 设置了 `ClientIDMode` 为 `AutoID`,为 `TextBox` 设置为 `Static`。现在,让我们看看生成的客户端 ID。

Brij_634099931624398203_normalpage4.jpg

图:查看源:使用 ASP.NET 4.0 的普通页面

现在,如果您查看 Label 的客户端 ID,它与以前的 ID 相同,因为我将其设置为 Auto。

但是,对于 `TextBox`,我将其设置为 `static`。因此,这里的客户端 ID 与我们在 aspx 页面上设置的 ID 相同。这就是 ASP.NET 4.0 的强大之处。如果我们设置为 static,.NET 引擎将不会为控件生成新的客户端 ID;它将使用控件的 ID 作为客户端 ID。

注意: 在这里需要确保一件事,如果我们设置模式为 static,那么页面上就不应该有具有相同 ID 的控件,因为它们将具有相同的客户端 ID,在客户端访问时可能会出现问题。

Predictable:这是我喜欢的另一种客户端 ID 生成模式。当您不确定 ID 在页面上是否唯一时,可以使用此属性。此值使我们能够预测渲染页面上的客户端 ID。当您将模式设置为此值时,需要根据自己的选择设置更多属性。

现在我将采用上面的例子。现在,aspx 代码将是这样的:

Data control page with ASP.NET 4.0

图:使用 ASP.NET 4.0 的数据控件页面

这里有一点是,我们正在使用数据控件,那么我们就不能将其设置为 static,因为将根据数据生成多个控件。

因此,这里我们将使用模式 **Predictable**,以便我们可以预测控件的 ID 会是什么。我们还需要设置另一个属性 `ClientIDRowSuffix`。我将其设置为 ID,即 ID 列。

现在,让我们看看生成的客户端 ID。

View Source: Data control page with ASP.NET 4.0

图:查看源:使用 ASP.NET 4.0 的数据控件页面

现在,如果我们查看 ClientID,这里是 `MainContent_gridviewBooks_lblName_1`。所以,如果我们仔细看,我们会发现这里没有计数器之类的东西。这里有 contentplaceholder 的第一个 ID,gridview 的 ID,label 的 ID,以及我们设置的后缀 ID。所以,这确实是可预测的 Smile,其他行也类似。

Inherit:这也是一个可以为此属性设置的值。顾名思义,这意味着控件的 ID 生成将与父控件相同。这是控件的默认行为。

在各个级别设置属性

我们可以在多个地方设置 `ClientIDMode` 属性。可以在控件级别、页面级别以及应用程序级别设置。行为将是相同的。我们可以按如下方式在页面指令中设置它:

ClientIDMode at Page level

图:页面级别的 ClientIDMode

要将其设置为应用程序级别,我们需要在配置文件中进行设置,如下所示:

这将在应用程序的所有页面中生效。

ClientIDMode at Application level

图:应用程序级别的 ClientIDMode

反馈与建议

反馈是改进的关键。我请求大家分享您的反馈并给我一些建议,这将鼓励我进行更多高质量的写作,并提供帮助。

© . All rights reserved.