我正在尝试将主页面引入现有的webforms网站,由于过去客户端ID损坏而避免使用它们(我不想处理错误并且执行<%foo.ClientID%>无处不在:)
目标:使用'静态'id值(服务器控件的id属性中的任何内容)除之外的数据绑定/重复控件,这些控件会因这些情况而中断,因此需要后缀或其他任何区分(基本上,可预测)
现在该站点已迁移到ASP.NET 4.0,我首先尝试使用静态的ClientIDMode(在web.config中),但是打破了太多地方重复控件(例如gridview中的复选框),因为它们都导致了具有相同的身份。
所以,我接着尝试了Predictable(再次,只是在web.config中),以便重复控件不会有冲突的ID,并且它除了主页面内容占位符(这确实是一个命名容器)仍然反映在生成的客户端ID中(例如,ContentPlaceHolder1_someCheckbox)。
当然我可以将web.config设置保留为静态,然后通过所有数据绑定/重复控件将它们切换为Predictable,但我希望有一些更简单/更简单的方法来获得该效果而无需分散ClientIDMode属性在那N个地方(或用我自己的用户控件扩展所有那些数据绑定控件,只设置clientidmode,或其他)。
我甚至想过将web.config设置为static并执行一个master或basepage处理程序(preinit?不确定是否可行),这将使用OfType <INamingContainer
&gt;()进行walk控制(在类型上可能是一个更好的选择,但这似乎是一个很好的起始选择,看看转发器和gridview)然后将它们设置为Predictable所以我会在重复控件之外的所有“正常”事情上保持静态但不必处理静态内部事物,如gridview / repeater /等。
我没有看到任何方法来标记内容占位符,以便它“选择”包含在子ID中 - 将占位符的ID设置为空/空白不起作用,因为它是必需的属性:)
那时我觉得有一种更好/更简单的方式让我失踪并决定问SO:)
编辑:我考虑过将所有'fif by id'jquery调用从$('#foo')更改为fetch_by_id('foo'),然后让该函数通过检查$('#'返回'正确' foo')。长度然后$('#ContentPlaceHolder1_foo')。长度(也许还有其他模式)或甚至让它返回$('#foo,#ContentPlaceHolder1_foo')(再次,可能是其他模式)但改变所有地方我通过id获取元素看起来也很丑陋,如果可能的话,我想避免使用抽象层:)
Edit2:使用id $ ='foo':
的jQuery选择器进行WRT我担心做这样的事情(虽然它可能比想象的更真实)是当一个页面中的一个id以另一个结束时。例如,如果页面包含id为'foo'和'barfoo'的元素,那么id $ ='foo'也会意外地包含'barfoo'。当然有很多方法可以防止这种情况(比如使用元素类型后缀,所以fooCheckbox和barfooButton等),但我不想扫描现有的源和/或强制执行新的命名规则。
由于并非所有控件都是服务器控件,因此我不能$ ='_ foo',因为找不到正常的div id =“foo”(我宁愿避免使用runat =“server”)破坏这个名字:)
我考虑的另一件事是为每个元素创建一个唯一的css类名,然后选择它(因为类显然不会被破坏)但是这样做非常hacky并且在做'真正的'CSS时肯定会搞砸了工作:))
答案 0 :(得分:2)
ClientIDMode = UI.ClientIDMode.Static
你必须在“构造函数”中设置它。
答案 1 :(得分:0)
老实说,我不知道是否有一种简单的方法可以做到这一点,但考虑到你使用的是我过去所做的jQuery,我使用的是attribute ends with the selector method。
由于.Net将你的“静态”id附加到它生成的id的末尾,你可以使用jquery选择器$("input[id$='yourstaticid']")
来获取它。
我知道这不是您正在寻找的解决方案,但它会让您的'fetch_by_id'变得更简单。
希望它有助于或至少给你一个想法。