代码之家  ›  专栏  ›  技术社区  ›  James Manning

ASP.NET 4.0 WebForms-如何简单地将ContentPlaceHolder1从客户端ID中保留出来?

  •  1
  • James Manning  · 技术社区  · 14 年前

    我正试图将母版页介绍给一个现有的Web窗体网站,该网站在过去由于客户端ID损坏而避免使用母版页(而且我不想处理此损坏并在任何地方执行<%foo.clientID%>)。

    目标:使用“静态”ID值(服务器控件的ID属性中的任何值) 除了 对于数据绑定/重复控件,这些控件会因这些情况而中断,因此需要后缀或其他内容来区分(基本上是可预测的)

    既然该站点迁移到了ASP.NET 4.0,我首先尝试使用静态的clientIdMode(在web.config中),但是这样做破坏了太多重复控件的位置(例如,GridView中的复选框),因为它们都使用相同的ID。

    因此,我尝试了可预测(再次尝试,只在web.config中),这样重复的控件就不会有冲突的ID,并且工作得很好。 除了 母版页内容占位符(实际上是命名容器)仍反映在生成的客户端ID中(例如,ContentPlaceHolder1_SomeCheckBox)。

    当然,我可以将web.config设置保留为静态,然后遍历所有数据绑定/重复控件,将它们切换为可预测的,但我希望有一些更简单/更简单的方法来实现这一效果,而不必将clientIdMode属性分散在这些n个位置(或使用我自己的userControl扩展所有这些数据绑定控件)。这只会设置clientidmode或其他)。

    我甚至考虑将web.config设置为static,并执行master或basepage处理程序(preinit?不确定这是否可行)这将使用类型为的walk控件 <INamingContainer >()。

    我看不出任何方法来标记内容占位符,使其“选择不包含在子ID中”-将占位符的ID设置为空/空白不起作用,因为这是必需的属性:)

    在那一点上,我认为有一个更好/更简单的方法我是失踪了,并决定问这样的:)

    编辑:我考虑将我的所有“ID提取”jquery调用从$(‘foo’)更改为按ID(‘foo’)提取,然后让该函数通过检查$(‘foo’).length然后检查$(‘contentPlaceHolder1 _foo’).length(或者其他模式),或者甚至只让它返回$(‘foo,contentPlaceHolder1 _foo’)。但是,通过i d来改变我获取元素的所有位置看起来也很难看,如果可能的话,我想避免使用抽象层。)

    edit2:wrt使用id$='foo'的jquery选择器:

    我担心做这样的事情(尽管这可能比实际情况想象的要多)是当一个页面中的一个ID以另一个结束时。例如,如果一个页面有id为'foo'和'barfoo'的元素,那么id$='foo'也会意外地包含'barfoo'。当然,有很多方法可以防止这种情况发生(比如用元素类型后缀,所以foocheckbox和barfoobutton之类的),但我不想扫描现有的源代码和/或强制执行新的命名规则。

    因为不是所有的控件都是服务器控件,所以我也不能$=“foo”,因为找不到正常的div i d=“foo”(我宁愿避免runat=“server”来管理名称)。

    我考虑的另一件事是为每个元素创建一个独特的CSS类名,然后选择它(因为类显然不会被破坏),但这样做非常简单,而且在做“真正的”CSS工作时一定会弄脏事情:)

    2 回复  |  直到 12 年前
        1
  •  0
  •   drusnov    14 年前

    老实说,我不知道是否有一种简单的方法可以做到这一点,但是考虑到您正在使用jquery,我过去所做的就是 attribute ends with the selector method .

    由于.NET将您的“静态”ID附加到它生成的ID的末尾,所以您可以使用jquery选择器获取该ID。 $("input[id$='yourstaticid']") .

    我知道这不是你要找的解决方案,但它会使你的“按ID取货”更简单。

    希望它至少能帮助你或给你一个想法。

        2
  •  2
  •   Perception    12 年前
    ClientIDMode = UI.ClientIDMode.Static
    

    您必须在“构造函数”中设置它。