【问题标题】:Naming conventions in MVC partial views to avoid ID collisionsMVC 局部视图中的命名约定以避免 ID 冲突
【发布时间】: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


    【解决方案1】:

    我觉得你想多了。简单的答案是,它们不一样,所以不要给它们相同的 ID。如果它们有相似之处,那就是类的用途。如果一个输入是用于注册时事通讯,则将其称为 NewsletterEmail。如果另一个用于用户登录表单,则将其命名为 UserEmail。使用更具描述性的 ID 是好的 HTML,甚至远不及 Webforms 造成的混乱。

    【讨论】:

    • 我已经在像这样重命名,直到我没有任何重复的 ID 为止)很好奇人们会想出什么“复杂”的想法)更好的例子:我有一个“地址” control' 与 Address1、City 等,我想要页面上的其中两个控件,但我希望它们绑定
    • 我是故意想先想太多,然后再少一些问题。里面也有小鬼鼓吹:i57.photobucket.com/albums/g212/nicoleavila75/…
    • 它们是否在数据绑定列表中?如果是这样,只需附加项目的 ID。例如地址1_123、城市_123等
    • 如果你一开始就过于复杂,那么你以后会遇到更多的问题,而不仅仅是保持简单。
    • 我还想提高对问题的认识,因为了解问题很重要。事实上,即使你确实理解了这个问题,你有时也会因为错误而搞砸——因此有了 jQuery 欺骗检测器功能。但是是的,绝对不应该“害怕”过度描述性的名称
    【解决方案2】:

    就表单字段而言,我认为您将id 属性与name 属性混淆了。

    您提到的 jQuery 适用于表单字段(稍作调整):

    $('#contactUsForm input[name="Email"]')
    

    【讨论】:

    • 是的,这是一个非常重要的区别。
    • 谢谢布兰农 - 现在明白为什么我特意说我没有测试过 :-) 我忘了你会自动获得通过 ID 或名称搜索同一字段的能力.此策略可能是“过于复杂”解决方案的一部分。我只是不太了解绑定来写一个
    • 是的,id 属性对于表单字段来说并不是必需的。在过去,给一个字段一个 id 更容易,但使用 jQuery,你不妨只按名称查找 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2011-08-10
    • 2013-04-12
    • 2012-11-01
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多