我知道在 ASP.NET 的下一个版本中,我们最终能够在 System.Web 控件上设置 clientid,而无需框架以准智能的方式为我们执行此操作,例如:
id="ctl00__loginStatus__profileButton"
有谁知道在此期间强制将上述 id 设置为类似的好方法
id="profileButton"
主要原因是在向页面动态添加控件时在 jQuery 中对 clientid 的操作。我可以看到的问题是更改 ID 会破坏 Viewstate?
您必须使用以下ClientIDMode
属性:
<asp:xxxx ID="fileselect" runat="server" ClientIDMode="Static"/>
我倾向于做的是动态生成处理这个的javascript方法。您可以在标记或代码中执行此操作,例如:
<script language="javascript" type="text/javascript">
function doXYZ()
{
$("#" + getListBoxId()).css(...)
}
function getListBoxId()
{
return "<%=this.myListBox.ClientId>";
}
</script>
您还可以在后面的代码中构建函数并注册它们。
编辑
几个月前,我需要修复一些服务器控件的 id,我设法破解了它,并在这里描述了我的方法。
基本上,您需要将控件放在像用户控件一样的命名容器中,然后覆盖几个防止子控件获取其唯一标识的属性。
性能不是很好,但您可以使用此选择器语法来匹配混乱的 ClientID:
$("[id$='_profileButton']")
这匹配任何以_profileButton结尾的元素。添加前导下划线可确保您匹配所需的元素,而不是另一个以子字符串“profileButton”结尾的元素(例如“myprofileButton”)。
由于它必须遍历整个 DOM,如果您在循环中使用它或一次多次使用它,性能可能会很差。如果你不过度使用它,性能影响不是很显着。
另一种方法是用 div 或 span 与静态 id 包装您的控件,然后通过它访问控件。
例如
<span id="mySpan">
<asp:TextBox id="txtTest" runat="server" />
</span>
然后,您可以在 MySpan 中定位输入标签。(虽然我同意能够指定一个好听的名称会很好,前提是您可以处理命名冲突......)
我在 asp.net webforms 中开发时经常遇到这个“问题”。在大多数情况下,我倾向于使用元素的 css 类。
jQuery(".My .Container12")
在开始操作 id:s 之前,也许这也是您可以处理它的一种方式?这是一个简单的解决方案。
还有一个未提及的解决方案是子类化 ASP.NET 控件并强制使用 ID:
public class MyCheckBox : CheckBox
{
public string ForcedId { get;set; }
public override string ID
{
get
{
if (!string.IsNullOrEmpty(ForcedId))
return ForcedId;
else
return base.ID;
}
set
{
base.ID = value;
}
}
public override string ClientID
{
get
{
return ID;
}
}
}
然后在你知道 ID 永远不会冲突的地方使用它:
<mytag:MyCheckBox ForcedId="_myCheckbox" runat="server" />
如果您正在使用列表,您将需要编写一个 ListControlAdapter,并且还需要为您使用的每种类型的列表(下拉列表、复选框、单选按钮、列表框)编写适配器。或者交叉双腿等待 .NET 4.0。