0

我知道在 ASP.NET 的下一个版本中,我们最终能够在 System.Web 控件上设置 clientid,而无需框架以准智能的方式为我们执行此操作,例如:

id="ctl00__loginStatus__profileButton"

有谁知道在此期间强制将上述 id 设置为类似的好方法

id="profileButton"

主要原因是在向页面动态添加控件时在 jQuery 中对 clientid 的操作。我可以看到的问题是更改 ID 会破坏 Viewstate?

4

6 回答 6

7

您必须使用以下ClientIDMode属性:

<asp:xxxx ID="fileselect" runat="server" ClientIDMode="Static"/>  
于 2012-11-03T07:15:46.000 回答
6

我倾向于做的是动态生成处理这个的javascript方法。您可以在标记或代码中执行此操作,例如:

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

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

</script>

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

编辑

几个月前,我需要修复一些服务器控件的 id,我设法破解了它,并在这里描述了我的方法。

基本上,您需要将控件放在像用户控件一样的命名容器中,然后覆盖几个防止子控件获取其唯一标识的属性。

于 2009-02-13T15:46:04.873 回答
1

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

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

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

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

于 2009-02-13T15:46:47.650 回答
1

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

例如

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

然后,您可以在 MySpan 中定位输入标签。(虽然我同意能够指定一个好听的名称会很好,前提是您可以处理命名冲突......)

于 2009-10-19T07:39:43.000 回答
0

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

jQuery(".My .Container12")

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

于 2009-02-13T15:54:50.297 回答
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。

于 2009-10-19T08:40:11.457 回答