在ASP.NET中强制客户端ID

时间:2009-02-13 15:39:36

标签: asp.net clientid

我知道在ASP.NET的下一个版本中,我们最终能够在System.Web控件上设置clientids而不用框架以准智能方式为我们做这些:例如:

id="ctl00__loginStatus__profileButton"

在此期间,是否有人知道一个好的方法强制将上述id强制为

id="profileButton"

这个的主要原因是在动态地向页面添加控件时操纵jQuery中的clientids。我能看到的问题是改变ID会破坏Viewstate吗?

6 个答案:

答案 0 :(得分:7)

您必须使用ClientIDMode属性:

<asp:xxxx ID="fileselect" runat="server" ClientIDMode="Static"/>  

答案 1 :(得分:6)

我倾向于动态生成处理此问题的javascript方法。您可以在标记或代码后面执行此操作,例如:

<script language="javascript" type="text/javascript">
function doXYZ()
{
   $("#" + getListBoxId()).css(...)
}

function getListBoxId()
{
 return "<%=this.myListBox.ClientId>";
}

</script>

您也可以在后面的代码中构建函数并注册它们。

修改

几个月前我需要修复一些服务器控件的ID,我设法破解它并在此处描述了我的方法here

基本上,您需要将控件放在命名容器(如用户控件)中,然后覆盖一些阻止子控件获取其唯一ID的属性。

答案 2 :(得分:1)

性能不是很好,但您可以使用此选择器语法来匹配凌乱的ClientID:

$("[id$='_profileButton']")

匹配 _profileButton 结尾的任何元素。添加前导下划线可确保您匹配所需的元素,而不是匹配子字符串“profileButton”中的另一个元素(例如“myprofileButton”)。

由于它必须遍历整个DOM,因此如果您在循环中使用它或者一次多次使用它,性能可能会很差。如果不过度使用它,性能影响不是很大。

答案 3 :(得分:1)

另一种方法是使用带有静态id的div或span包装你的控件,然后通过它访问控件。

E.g。

<span id="mySpan">
<asp:TextBox id="txtTest" runat="server" />
</span>

然后您可以在MySpan中定位输入标签。 (虽然我同意能够指定一个好名字会很好,只要你能处理命名冲突......)

答案 4 :(得分:0)

在使用asp.net webforms进行开发时,我经常遇到这个“问题”。在大多数情况下,我倾向于使用元素的css类。

jQuery(".My .Container12")

在开始操作id:s之前,或许这是一种你可以处理它的方式吗?这是一个简单的解决方案。

答案 5 :(得分:0)

还有一个未提及的解决方案是子类化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。