题
我是一个信息建筑师和JavaScript开发人员通过贸易的现在,但是最近我已经得到回后端编码。并且,同时试图获得一个HTML原型的集成和工作与我们C#基CMS,我来打击我们的程序员通过HTML ID属性被任意改写。网为形式的要素。
我能明白的代码-背后的推理。净改变身份证,但事实上你可以不再使用Id当试图制定例如jQuery增强的接口是造成一些摩擦。我能做些什么来解决这个吗?
我已经试过使用类属性,而不是的,但是这是真的蹩脚的,不是什么它意味着并没有得到围绕这一问题。净有效地改变渲染源的飞行。它还意味着CSS是少有的现在和低效率的创建和维护。
任何建议或意见极大的赞赏-什么几个少不眠之夜...
解决方案
简短的回答是否定的,与web表单id总是可以改写根据筑巢的元素。你可以获得的id通过ClientID性,所以你可以设定id入变量在一个脚本末页/控制然后把它们放到的!
事情是这样的:
<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>
这是一个黑客我知道,但这会的工作。(我应该注意对联合国发起,我使用的原型$获得通过id方法有)
其他提示
一个方法是重写ID的手动:
public override string UniqueID
{
get { return this.ID; }
}
public override string ClientID
{
get { return this.ID; }
}
Rick Strahl写了一篇博客 一些更多的信息,这种做法。
看看ASP.Net 视-这地址的过度杀对象的层次结构ASP.Net 产生的默认。
这个网站是写在视(我)-看看它的结构。是我工作的一个新项目现在我将考虑它第一次
如果你坚持的基本ASP.Net 然后小心压倒一切的ClientID和UniqueID-它倾向于打破许多网络的控制。
最好的方法我发现是传递的无法读取ClientID出的Javascript。
你可以延长。网的控制和使他们重返实际的id的相关性。
ClientID是id属性和UniqueID是该名称属性的要素。所以当你建立一个文如下,并使用这个代替文本框框架,则编码和名称的属性呈现为相同的服务器侧身份证。
public class MyTextBox : TextBox
{
public override string ClientID { get { return ID; } }
public override string UniqueID { get { return ID; } }
}
使用这个新的用户控制,基本上注册这种控制作为你会做一个自定义用户控制(你可以做的是在网上。config这样你就不必做到在所有网页):
<%@ Register Assembly="MyLibrary" NameSpace="MyLibrary.WebControls" TagPrefix="MyPrefix" %>
和使用这样,你会使用文本框:
<MyPrefix:MyTextBox ID="sampleTextBox" runat="server" />
就个人而言,我可以使用一套的方法,我已经开发了用于弥合服务器侧ASP.NET "魔法"(我还没有使用MS视的东西还)和我的客户代码,因为处理的Id,发生。这里只是一个,可能或不可能证明是有用的:
public void RegisterControlClientID(Control control)
{
string variableDeclaration = string.Format("var {0} = \"{1}\";", control.ID, control.ClientID);
ClientScript.RegisterClientScriptBlock(GetType(), control.ID, variableDeclaration, true);
}
所以,在你的服务器侧码你只是叫这并通过实例中的一个控制你想使用一个友好的名字。换句话说,在此期间 设计时, 你可以有一个"文本框"ID"m_SomeTextBox",并且希望能够编写JavaScript使用相同的名字-你只会叫这方法在你的服务器方代码:
RegisterControlClientID(m_SomeTextBox);
然后对客户的以下呈现:
var m_SomeTextBox = "ctl00_m_ContentPlaceHolder_m_SomeTextBox";
这样,所有的你的代码可以被相当一无所知什么ASP.NET 决定名称的变量。授予的,还有一些需要注意到这一点,例如,当你有多个实例,一个控制一页上(因为使用多个实例的用户控制所有的有的一个实例m_SomeTextBox在他们之内,例如),但一般来说,这种方法可能是有用的你的最基本需要。
我通常做的是创建一个一般功能,收到名字的领域。这增加了通常的"asp.net"前缀和返回的对象。
var elemPrefix = 'ctl00-ContentPlaceHolder-'; //replace the dashes for underscores
var o = function(name)
{
return document.getElementById(elemPrefix + name)
}
这可以使用这种呼吁在jQuery
$(o('buttonId')).bind('click', function() { alert('hi); });
你肯定不想要硬代码的asp。净生成的标识到您CSS,因为它可以改变,如果你重新安排的东西在你的网页,在这样一种方式,控制你的树变化。
你是对的,CSS Id有他们的地方,所以我将忽略建议只是使用的课程。
各javascript黑客这里描述的是大材小小的问题。所以是继承从一类和复盖ID财产。它肯定无助于建议的交换以视,当你想要做的是重组的一些CSS。
只有独立的div和跨越你的目标与CSS。别目标的ASP.NET 控制直接的,如果你想使用的标识。
<div id="DataGridContainer">
<asp:datagrid runat=server id="DataGrid" >
......
<asp:datagrid>
</div>
如果你使用jQuery然后你有的 CSS选择和技客户选择 在你的处置为目标的元素在你的网页。因此,而不是挑出一个提交按钮通过它的身份证,你可以做一些事情,如:
$('fieldset > input[type="submit"]').click(function() {...});
我可以看到如何。净系统感觉不直观,但是给它一个机会。以我的经验,它实际上结束了创造更清洁的代码。肯定
<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>
工作正常。但是,这是遭受不正模块化。你真正想要的是这样的:
<script type="text/javascript">
function MakeAClick(inid)
{
$(inid).bind('click', function() { alert('hi); });
}
</script>
然后与你的代码java边或C#一边,你叫MakeAClick.当然在C#方面,它使得更有意义,你只ClientID在那里。
也许这个是真正的问题与你的代码是审查。
一个更好的办法就是使用ClientIDMode,并将其设置到 static
.你甚至可以将其设置为一个特定的网页或者全球网络。配置文件。然后你从来没有处理这个问题再次和你的,这是干净多了。
顶的网页:
<%@ Page Title="" ClientIDMode="Static" Language="C#" CodeBehind="..." Inherits="WebApplication1.WebForm2" %>
对控制仅仅是:
<asp:Panel runat="server" ClientIDMode="Static"></asp:Panel>