【发布时间】:2009-02-04 04:44:14
【问题描述】:
来自 ASP.NET(MVC 之前)的任何人都已经习惯于能够为他们的控件提供他们想要的任何 ID。您可以在 .asmx 文件中创建名为 Email 的字段,在主页中创建名为 Email 的字段,在母版页中创建名为 Email 的字段,在页面上放置 .asmx 文件的多个实例他们都会获得自己的唯一 ID。
现在有big problems 与此有all been discussed before。通常建议的解决方案是“switch to MVC”,您可以在其中控制您的 ID。太棒了!...除了...
...如果您不小心,最终会遇到的问题(在切换到 MVC 之后)类似于以下内容:
- 页面上的两个表单都包含一个电子邮件字段,其 ID 为
Email。 - 浏览器会很好地呈现(重复的 id 不是“XHTML 允许的”,但它们不会被浏览器拒绝)
- 即使是表单提交也将起作用,因为
FORM会将其自己的相应内容发送到服务器操作。
如果你是一个不关心标准的非常糟糕的程序员,你可以逃脱惩罚。但是,如果您开始使用 jQuery 甚至只是 getElementById(..),您将很快开始看到一些非常奇怪的东西:
假设:
- 您有两个用户控件,一个用于“提交 cmets”,一个用于“加入邮件列表”。每个内部都有一个
Email字段。他们每个人都有id="Email" -
您在“提交 cmets”控件中有 javascript 进行验证:
if ( $("#Email").val().indexOf("@") == -1 ) { // invalid email } 哎呀!
#Email选择器将选择页面上<input id="Email">的第一个实例。因此,您最终可能会在提交 SECOND 表单时实际验证 FIRST Email 字段的值。但是检查数据库 - 你会得到正确的值。这可以快速推动您的 QA 工作 ;-)
我正在寻找任何人可能想出的任何聪明的技巧。我在问题中发现了一些有趣的想法:ASP.NET MVC View User Control - how to set IDs,但我觉得答案还不够深入,也没有利用一些最新的绑定模型。
您可以做一些显而易见的事情,例如始终使用唯一的 IDS,方法是在每个 ID 前加上控制前缀或其他东西。这很快就开始看起来像 ASP.NET 1.0!
您可以做的另一件事是使用$('#contatUsForm #Email') 之类的选择器来获取电子邮件ID。但前提是您对没有 XHTML 感到满意。我认为这个解决方案非常糟糕。事实上它太糟糕了,我什至没有测试过 jQuery 是否能让你运行它!
一个有用的东西I came up with(在sunsean 的帮助下)是下面的 jQuery 函数 - 我把它放在我的母版页上,肯定会一直保留到我部署为止。
// Warning Duplicate IDs - place on master page in $(function() { ... });
$('[id]').each(function(){
var ids = $('[id='+this.id+']');
if(ids.length>1 && ids[0]==this)
alet('Multiple IDs #'+this.id);
});
这将帮助您快速找到哪些控件可能会出现此问题,但让我仍在寻找优雅的解决方案。
我对与模型绑定结合使用的解决方案特别感兴趣。一旦我开始手动添加前缀,我将开始在所有地方破坏模型绑定。
肯定有比我聪明的人已经想通了……
【问题讨论】:
标签: jquery asp.net-mvc