C# asp.net 为啥ClientID和UniqueID有区别?

Posted

技术标签:

【中文标题】C# asp.net 为啥ClientID和UniqueID有区别?【英文标题】:C# asp.net Why is there a difference between ClientID and UniqueID?C# asp.net 为什么ClientID和UniqueID有区别? 【发布时间】:2010-12-09 09:08:09 【问题描述】:

我知道 ClientID 用于 javascript,UniqueId 用于服务器端,并且在 asp.net 2.0 中 ClientID 使用下划线 (_) 而 UniqueId 使用美元符号 ($)。但我不明白为什么要使用两个不同的 id。为什么不能只使用或使用下划线或在两者中使用美元符号:服务器端和客户端。有人可以解释一下吗?

【问题讨论】:

【参考方案1】:

(除了我上面的原始答案)

好吧,您可能知道 UniqueID 与 name 属性一起使用,ClientId 与呈现的 html 标记的 id 属性一起使用。 UniqueID 使用冒号作为分隔符。另一方面,ClientId 使用下划线作为分隔符,因为 JavaScript 变量名中不允许使用冒号。 ClientID 在页面上确实和 UniqueID 一样是唯一的,但 ClientID 是针对客户端处理的,而 UniqueID 是针对服务器端的(很明显),后者尤其是用于路由回发数据和具有复合控件的事件

但是我认为一些原因可能是在普通控件 ID 中使用下划线作为分隔符是非常常见的行为,因此下划线不能在 UniqueID 中用作控件分隔符(如果我们从理论上考虑使用一个属性进行管理),因为您可以不要区分控件。另一方面,出于同样的原因,您不能在控件 ID 中使用冒号,页面框架不允许这样做,因此它确保冒号无法到达 ClientID(这是因为 JavaScript 不喜欢它) .

由于这些原因,冒号在 UniqueID 中使用是一个不错的选择,因为 FindControl 方法可以使用它来导航控件树并定位控件(它可以轻松拆分 UniqueID)。

【讨论】:

【参考方案2】:

this.UniqueID 是附加了所有命名容器的控件名称, 将其视为完全限定的控件名称。 this.ClientID 是值 会出现在控件的id属性中,它是一个翻译 uniqueid 是(几乎)符合 html 的 id 标签(前导 下划线并不是真正的 html 兼容)。

【讨论】:

因此,前导下划线(实际上)不兼容 html。那么为什么不使用美元符号呢?为什么不使用服务器端的 ClientId 而不是 UniqueId?两者完全一样,唯一的区别是美元符号和下划线的使用。 ClientID 的作用是返回可以在客户端脚本中使用的控件的唯一标识 ID(相当于 UniqueID,但使用下划线作为控件分隔符)。 我想你不明白我的意思 :) Javascript 不喜欢美元符号,因此它使用下划线。现在很清楚了。所以我的下一个问题是:为什么不在服务器端使用下划线?因此,为什么不在服务器上使用 ClientID 呢?为什么必须有一个使用美元符号的独立物业?为什么下划线不能在服务器上使用?

以上是关于C# asp.net 为啥ClientID和UniqueID有区别?的主要内容,如果未能解决你的问题,请参考以下文章

C# ASP.NET Core 5.0 - 为啥在使用 [Authorization] 时甚至不调用该方法

为啥我的 Jquery Ajax 调用不起作用?(Asp.net MVC C#)

为啥要创建 ASP.NET 5 类库项目?

为啥 .Mobile.cshtml 未在 ASP.NET Core C# Razor Pages Web 应用程序中呈现?

uni-app APP-PLUS 获取客户端信息 clientid 等

为啥在asp.net mvc中没有 default.aspx