我可以阻止.NET吃ID吗?

mar*_*dup 21 .net html javascript css c#

我现在是一名信息架构师和JavaScript开发人员,但最近我又重新开始进行后端编码.而且,在尝试将HTML原型集成并与我们基于C#的CMS一起工作的同时,我开始向我们的程序员吹嘘HTML ID属性被.NET任意重写为表单元素.

我可以理解.NET更改ID的代码隐藏推理,但是在尝试开发例如jQuery增强接口时你不能再使用ID这一事实会引起一些摩擦.我该怎么做才能解决这个问题?

我尝试过使用class属性,但这真的很糟糕,不是它的意思,也没有解决.NET有效改变渲染源的问题.这也意味着CSS现在不太有用,创建和维护效率也较低.

任何提示或建议非常感谢 - 任何少数不眠之夜...

Gle*_*ven 25

简短的回答是否定的,对于webforms,id总是可以根据元素的嵌套重写.您可以通过ClientID属性访问id,因此您可以将id设置为页面/控件末尾的脚本中的变量,然后将它们放入jQuery中.

这样的事情:

<asp:button id="ImAButton" runat="server">Click Me</asp:button>

<script type="text/javascript">
var buttonId = "<%=ImAButton.ClientId%>";
$("#"+buttonId).bind('click', function() { alert('hi); });
</script>
Run Code Online (Sandbox Code Playgroud)

这是我知道的黑客攻击,但它会奏效.(我应该注意未启动的,我正在使用原型$ get by id方法)


Jon*_*way 12

一种方法是手动覆盖ID:

public override string UniqueID
{
  get { return this.ID; }
}
public override string ClientID
{
  get { return this.ID; }
}
Run Code Online (Sandbox Code Playgroud)

Rick Strahl撰写了一篇博客文章,其中提供了有关该方法的更多信息.


Kei*_*ith 7

查看ASP.Net MVC - 它解决了ASP.Net默认生成的过度杀死对象层次结构.

这个网站是用MVC编写的(我认为) - 看看它的结构.如果我现在正在开展一个新项目,我会先考虑它

如果你坚持使用基本的ASP.Net,那么要小心覆盖ClientID和UniqueID - 它往往会破坏许多Web控件.

我发现的最好方法是将不可读的ClientID传递给Javascript.