Соглашения об именах в частичных представлениях MVC, чтобы избежать конфликтов ID - PullRequest
7 голосов
/ 04 февраля 2009

Любой, кто прибывает из ASP.NET (до MVC), привык иметь возможность предоставлять своим элементам управления любые идентификаторы, которые они хотят. Вы можете создать поле с именем Email в файле .asmx, поле с именем Email на главной странице, поле с именем Email на главной странице, разместить на странице несколько экземпляров файла .asmx. и все они получат свои уникальные идентификаторы.

Теперь есть большие проблемы с этим, которые все обсуждались до . Часто предлагаемое решение состоит в том, чтобы « переключиться на MVC », где вы можете контролировать свои идентификаторы. Фантастика! ... кроме ...

... проблема, с которой вы сталкиваетесь (после перехода на MVC), если вы неосторожны, выглядит примерно так:

  • две формы на странице, каждая из которых содержит поле электронной почты с Email в качестве идентификатора.
  • браузер будет отображаться очень хорошо (дубликаты идентификаторов не «разрешены XHTML», но они не отклоняются браузером)
  • даже отправка формы будет работать, так как FORM отправит свой собственный соответствующий контент на действие сервера.

С этим вы можете сойти с рук - если вы действительно плохой программист, который не заботится о стандартах. Однако вы быстро начнете видеть некоторые действительно странные вещи, если начнете использовать jQuery или даже просто getElementById(..):

Допустим,

  • у вас есть два пользовательских элемента управления, один для «Отправить комментарий» и один для «Присоединиться к списку рассылки». У каждого есть поле Email внутри. У каждого из них есть id="Email"
  • у вас есть javascript в элементе управления "отправлять комментарии" для проверки:

    if ( $("#Email").val().indexOf("@") == -1 ) {
        // invalid email 
    }
    
  • Oops! Селектор #Email выберет первый экземпляр <input id="Email"> на странице. Поэтому вы можете закончить проверку значения поля FIRST Email при отправке ВТОРОЙ формы. Но проверьте базу данных - и вы получите правильные значения. Это может быстро привести ваш QA к стене; -)

Я ищу какие-нибудь хитрые уловки, которые кто-нибудь мог придумать. В этом вопросе я нашел несколько интересных идей: ASP.NET MVC View User Control - как установить идентификаторы , но я не чувствовал, что ответы зашли слишком далеко или воспользовались некоторыми из последних моделей связывания.

Есть несколько очевидных вещей, которые вы могли бы сделать, например, всегда использовать уникальный IDS, добавляя к каждому ID префикс контрольного префикса или что-то в этом роде. Это начинает быстро выглядеть как ASP.NET 1.0!

Другая вещь, которую вы МОЖЕТЕ сделать, - это использовать селектор типа $('#contatUsForm #Email'), чтобы получить идентификатор электронной почты. Но только если у вас все в порядке с отсутствием XHTML. Я считаю это решение очень плохим. На самом деле это так плохо, что я даже не проверял, позволяет ли jQuery запускать его!

Одна полезная вещь Я придумал (с помощью 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);
});

Это поможет вам быстро найти, какие элементы управления могут показывать эту проблему, но заставляет меня искать элегантное решение.

Меня особенно интересуют решения, которые работают в сочетании с привязкой модели. Как только я начну добавлять префиксы вручную, я начну повсеместно нарушать привязку модели.

Должен быть кто-то умнее меня, который уже обдумал это ...

Ответы [ 2 ]

4 голосов
/ 04 февраля 2009

Я думаю, ты слишком обдумываешь это. Ответ прост: они не одинаковы, поэтому не давайте им одинаковые идентификаторы. Если они имеют общие черты, то для этого и нужны классы. Если один вход предназначен для подписки на новостную рассылку, назовите его NewsletterEmail. Если другой пользователь для формы входа в систему, назовите его UserEmail. Использование более описательных идентификаторов - это хороший HTML, который даже близко не приближается к беспорядку, который создает Webforms.

2 голосов
/ 04 февраля 2009

Что касается полей формы, думаю, вы путаете атрибут id с атрибутом name.

Упомянутый вами jQuery будет хорошо работать для полей формы (слегка подправлен):

$('#contactUsForm input[name="Email"]')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...