我知道,在ASP.NET的下一个版本,我们将最终能够设置的System.Web控制的ClientID无框架准智能的方式e.g这样做是为了我们:

id="ctl00__loginStatus__profileButton"

有谁知道在此期间的好方法,迫使上述ID喜欢的东西。

id="profileButton"

这种情况的主要原因是jQuery中所述的ClientID时动态地将控件添加到页面的操纵。我可以看到正在改变的ID将打破视图状态的问题?

有帮助吗?

解决方案

我倾向于做动态地产生其中处理该JavaScript方法什么。可以在标记或代码为此后面,从而例如:

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

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

</script>

您也可以建立在后面的代码的功能和注册。

修改

几个月前,我需要解决一些服务器控件的ID,我设法破解它,我这里介绍我的方法的此处

基本上你需要把控制等的用户控制一个命名容器内,然后覆盖几个属性,其防止子控件从得到他们UNIQUEID。

其他提示

您必须使用ClientIDMode属性:

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

在性能不是很大,但是你可以使用这个选择语法搭配凌乱的ClientID:

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

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

由于它遍历整个DOM,如果你在一个循环或数次一次使用它的性能很差。如果你没有过度使用它,对性能的影响并不十分显著。

另一种方式是用一个div或跨度具有静态id来包住控制,然后通过访问控制。

E.g。

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

您可以再瞄准里面MySpan输入标签。 (虽然我同意这将是很好能够指定一个好听的名字,只要你能够处理命名冲突......)

我经常运行这个“问题”,而在asp.net web表单开发。在大多数情况下,我倾向于使用的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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top