Любой, кто прибывает из 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);
});
Это поможет вам быстро найти, какие элементы управления могут показывать эту проблему, но заставляет меня искать элегантное решение.
Меня особенно интересуют решения, которые работают в сочетании с привязкой модели. Как только я начну добавлять префиксы вручную, я начну повсеместно нарушать привязку модели.
Должен быть кто-то умнее меня, который уже обдумал это ...