Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ASP.NET中强制客户端ID_Asp.net_Clientid - Fatal编程技术网

在ASP.NET中强制客户端ID

在ASP.NET中强制客户端ID,asp.net,clientid,Asp.net,Clientid,我知道,在ASP.NET的下一个版本中,我们最终将能够在System.Web控件上设置ClientID,而无需框架以准智能的方式为我们这样做,例如: id="ctl00__loginStatus__profileButton" 在此期间,有人知道一个好的方法来强制上面的id id="profileButton" 这样做的主要原因是在jQuery中将控件动态添加到页面时对ClientID的操作。我看到的问题是更改ID会破坏Viewstate?我倾向于动态生成处理此问题的javascript方法

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

id="ctl00__loginStatus__profileButton"
在此期间,有人知道一个好的方法来强制上面的id

id="profileButton"

这样做的主要原因是在jQuery中将控件动态添加到页面时对ClientID的操作。我看到的问题是更改ID会破坏Viewstate?

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

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

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

</script>
您还可以在代码隐藏中构建函数并注册它们

编辑

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


基本上,您需要将控件放入命名容器(如用户控件)中,然后重写一些属性,以防止子控件获取其唯一ID。

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

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


由于它必须在整个DOM中迭代,因此如果在循环中或一次多次使用它,性能可能会很差。如果不过度使用它,对性能的影响不会太大。

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

jQuery(".My .Container12")

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

另一种方法是使用静态id将控件包装为div或span,然后通过该id访问控件

例如


然后,您可以在MySpan中以输入标记为目标。尽管我同意,如果您能够处理命名冲突,那么能够指定一个好的名称将是一件好事。

还有另一个解决方案没有提到,那就是对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永远不会冲突的地方使用此选项:

如果您使用的是列表,则需要编写ListControlAdapter,还需要为您使用的每种类型的列表编写适配器,包括下拉列表、复选框、radiobutton和listbox。或者交叉双腿等待.NET 4.0。

您必须使用ClientIDMode属性:

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

这可能与Dave在循环中使用它的答案具有相同的性能缺点,等等。按类引用比按ID引用慢得多我的问题有点不清楚,我更希望能够设置ID,以便我始终知道它们是什么,而不必在客户机上使用查找表,客户机ID映射到另一种类型的idI,我知道我试图找到一个类似的解决方案,但很快就决定当时不值得这么做。
<mytag:MyCheckBox ForcedId="_myCheckbox" runat="server" />
<asp:xxxx ID="fileselect" runat="server" ClientIDMode="Static"/>