我正在尝试将母版页引入现有的 webforms 站点,该站点由于过去的客户端 ID 修改而避免使用它们(而且我不想处理修改并在任何地方都做 <% foo.ClientID %> :)
目标:使用“静态”id 值(服务器控件的 id 属性中的任何内容),但数据绑定/重复控件除外,这些控件会因这些情况而中断,因此需要后缀或其他区分(基本上,可预测)
现在该站点迁移到 ASP.NET 4.0,我首先尝试使用静态的 ClientIDMode(在 web.config 中),但这破坏了太多重复控件的地方(例如,gridviews 中的复选框),因为它们都产生相同的结果ID。
所以,然后我尝试了 Predictable(再次,只是在 web.config 中),这样重复控件不会有冲突的 id,它工作得很好,除了母版页内容占位符(它确实是一个命名容器)仍在反映在生成的客户端 ID 中(例如,ContentPlaceHolder1_someCheckbox)。
当然,我可以将 web.config 设置保留为静态,然后通过所有数据绑定/重复控件将它们切换为可预测,但我希望有一些更简单/更简单的方法来获得这种效果,而不必在那些 N 中分散 ClientIDMode 属性位置数(或使用我自己的用户控件扩展所有那些数据绑定控件,该控件仅设置 clientidmode 或其他)。
我什至想过将 web.config 设置为 static 并做一个 master 或 basepage 处理程序(preinit?不确定这是否可行),它将使用 OfType <INamingContainer
>() 进行控制(可能是类型的更好选择,但这似乎是查看中继器和网格视图的一个不错的开始选择),然后将它们设置为可预测的,这样我就可以在重复控件之外获得所有“正常”事物的静态,但不必处理网格视图/中继器等事物内部的静态/ETC。
我看不到任何标记内容占位符的方法,以便它“选择退出”不包含在子 ID 中 - 将占位符的 ID 设置为空/空白不起作用,因为它是必需的属性:)
那时我想有一种更好/更简单的方法我错过了,并决定问 SO :)
编辑:我考虑过将我所有的“按 id 获取”jquery 调用从 $('#foo') 更改为 fetch_by_id('foo') ,然后让该函数通过检查 $('#foo') 返回“正确的” .length 然后 $('#ContentPlaceHolder1_foo').length (可能还有其他模式),甚至只是让它返回 $('#foo, #ContentPlaceHolder1_foo') (同样,可能是其他模式)但改变了我获取元素的所有地方by id 看起来也很丑陋,如果可能的话,我想避免那个抽象层很容易:)
Edit2:WRT 使用 id$='foo' 的 jQuery 选择器:
我担心做这样的事情(尽管它可能比想象的更真实)是当页面中的一个 id 以另一个结尾时。例如,如果一个页面包含 id 为 'foo' 和 'barfoo' 的元素,那么 id$='foo' 也会意外地包含 'barfoo'。当然有很多方法可以防止这种情况发生(比如添加元素类型后缀,例如 fooCheckbox 和 barfooButton 或其他),但我不想扫描现有源和/或强制执行新的命名规则。
由于并非所有控件都是服务器控件,因此我也无法 $='_foo' 因为找不到普通的 div id="foo" (我宁愿避免 runat="server" 只是为了破坏姓名 :)
我考虑的另一件事是为每个元素创建一个唯一的 css 类名称并选择它(因为类显然不会被弄乱)但是这样做非常hacky,并且在做“真正的” CSS 工作时肯定会使事情变得混乱 :)