【问题标题】:Forcing client ids in ASP.NET在 ASP.NET 中强制客户端 ID
【发布时间】:2023-03-14 06:30:01
【问题描述】:

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

id="ctl00__loginStatus__profileButton"

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

id="profileButton"

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

【问题讨论】:

    标签: asp.net clientid


    【解决方案1】:

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

    <script language="javascript" type="text/javascript">
    function doXYZ()
    {
       $("#" + getListBoxId()).css(...)
    }
    
    function getListBoxId()
    {
     return "<%=this.myListBox.ClientId>";
    }
    
    </script>
    

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

    编辑

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

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

    【讨论】:

    • 我的问题有点不清楚,我希望能够设置 id 以便我始终知道它们是什么(而不必在客户端上使用查找表,客户端ids 映射到另一种类型的 id)
    • 我知道我试图找到一个类似的解决方案,但很快就认为这在当时是不值得的。
    【解决方案2】:

    性能不是很好,但是你可以使用这个选择器语法来匹配乱七八糟的 ClientID:

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

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

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

    【讨论】:

      【解决方案3】:

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

      jQuery(".My .Container12")
      

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

      【讨论】:

      • 这可能具有与 Dave 的答案相同的性能缺陷(在循环中使用它等)。按类引用比按 ID 慢很多
      【解决方案4】:

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

      例如

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          你必须使用ClientIDMode属性:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-29
            • 2011-08-11
            • 2011-03-05
            • 2010-11-10
            相关资源
            最近更新 更多