我遇到的问题有两种可能的解决方案。我不确定哪个解决方案“更正确”。
我有一个在页面上方打开的模式对话框。此对话框包含一个 ID 为“foo”的元素。
现在,这本身根本不是问题。但是,非对话框页面有多个选项卡。这些其他选项卡之一,在某些内容的深处,也有一个 ID“foo”。这会导致奇怪的间歇性问题,具体取决于遍历 DOM 树时首先遇到的“foo”。
不幸的是,这两个值都以完全相同的方式呈现完全相同的信息。唯一的区别是一个被托管在对话框中。使用了相同的模型——因此我的 ViewModel 生成了相同的 ID。
我可以做以下两件事之一:
- 显式覆盖这些 ID 创建方法之一,以确保对话框中生成的 ID 与非对话框中生成的 ID 相比是唯一的。
- 将我的 jQuery 搜索选择器修改为仅从对话框的表单向内读取——确保对话框不会捕获意外的 DOM 元素。
看起来第二个想法是一个更好的做法。我遍历的 DOM 节点更少,也不需要破解任何东西。但是,对于不知情的开发人员,由于没有从正确的区域开始搜索,仍然可能会意外地重新引入这个问题。
不过,同样的问题也适用于我们的应用程序的任何开发人员。他们需要明确知道要覆盖 ViewModel 的 ID 创建,这样它就不会创建相同的 ID。
如果以不同的形式封装重复的 ID,是否可以接受?对 ID 唯一性的期望在哪里不再有意义?
ID 是通过 MVC 的 EditorFor HTML Helper 生成的。我可以通过生成特定于表单的 ID 的方式覆盖它,但这显然不是 MVC 的意图。
<%= Html.EditorFor(model => model.CustomerDisplayName) %>
更新:看来我应该强制执行 ID 的唯一性。但是,ASP.NET MVC3 似乎没有提供一种简单的方法来确保 ID 对 DOM 是唯一的。我可以在表单的 ID 上附加,但这会产生巨大的 ID.. 不确定这是否是最好的调用。有什么想法吗?