Могу ли я остановить идентификаторы .NET для еды?
В настоящее время я являюсь разработчиком информационного архива и JavaScript-разработчиком, но в последнее время я снова возвращаюсь к заднему кодированию. И, пытаясь получить прототип HTML, интегрированный и работающий с CMS на С#, я пришел, чтобы сдуться с нашими программистами над атрибутами HTML ID, которые произвольно переписаны .NET для элементов формы.
Я могу понять аргументы в отношении кода для меняющихся идентификаторов .NET, но тот факт, что вы больше не можете использовать идентификаторы при попытке разработки, например. Усовершенствованные интерфейсы jQuery вызывают некоторое трение. Что я могу сделать, чтобы обойти это?
Я попытался использовать атрибут class вместо этого, но это действительно дерьмово, а не то, для чего это предназначено, и не обойти эту проблему .NET, эффективно меняя предоставляемый источник на лету. Это также означает, что CSS сейчас менее полезен и менее эффективен для создания и поддержки.
Любые советы или советы, которые очень ценят - все для нескольких менее бессонных ночей...
Ответы
Ответ 1
Короткий ответ - нет, с webforms идентификатор всегда можно переписать в зависимости от вложенности элемента. Вы можете получить доступ к id через свойство ClientID, чтобы вы могли установить идентификаторы в переменные в script в конце страницы/элемента управления, а затем поместить их в jQuery.
что-то вроде этого:
<asp:button id="ImAButton" runat="server">Click Me</asp:button>
<script type="text/javascript">
var buttonId = "<%=ImAButton.ClientId%>";
$("#"+buttonId).bind('click', function() { alert('hi); });
</script>
Это хак, который я знаю, но он будет работать.
(Я должен отметить для un-Init, я использую метод Prototype $get by id там)
Ответ 2
Один из способов - переопределить идентификатор вручную:
public override string UniqueID
{
get { return this.ID; }
}
public override string ClientID
{
get { return this.ID; }
}
Рик Страхл написал сообщение в блоге с дополнительной информацией об этом подходе.
Ответ 3
Посмотрите на ASP.Net MVC - он обращается к иерархиям объектов over-kill, которые ASP.Net генерирует по умолчанию.
Этот сайт написан в MVC (я думаю) - посмотрите на его структуру. Если бы я работал над новым проектом прямо сейчас, я бы подумал об этом первым.
Если вы застряли в базовом ASP.Net, будьте осторожны, переопределяя ClientID и UniqueID - он имеет тенденцию разбивать многие веб-элементы управления.
Лучший способ, который я нашел, - передать нечитаемый идентификатор ClientID в Javascript.
Ответ 4
Вы можете расширить элементы управления .net и заставить их возвращать действительный идентификатор, когда вызываются связанные свойства.
ClientID - это атрибут id, а UniqueID - атрибут name элементов html. Поэтому, когда вы создаете текстовое поле, подобное следующему, и используя это вместо текстового поля в фреймворке, вы делаете атрибуты id и name как те же, что и идентификатор на стороне сервера.
public class MyTextBox : TextBox
{
public override string ClientID { get { return ID; } }
public override string UniqueID { get { return ID; } }
}
Чтобы использовать этот новый пользовательский элемент управления, в основном зарегистрируйте этот элемент управления, как это было бы сделано для пользовательского элемента управления (вы можете сделать это в web.config, поэтому вам не придется делать это на всех ваших страницах):
<%@ Register Assembly="MyLibrary" NameSpace="MyLibrary.WebControls" TagPrefix="MyPrefix" %>
И используйте его, как если бы вы использовали текстовое поле:
<MyPrefix:MyTextBox ID="sampleTextBox" runat="server" />
Ответ 5
Лично я использую набор методов, которые я разработал для подключения серверной ASP.NET "магия" (пока я еще не использовал MS MVC), и мой клиентский код из-за перебора Идентификаторы, которые происходят. Вот только один, который может оказаться полезным или не может оказаться полезным:
public void RegisterControlClientID(Control control)
{
string variableDeclaration = string.Format("var {0} = \"{1}\";", control.ID, control.ClientID);
ClientScript.RegisterClientScriptBlock(GetType(), control.ID, variableDeclaration, true);
}
Итак, в вашем серверном коде вы просто вызываете это и передаете в экземпляр элемента управления, для которого вы хотите использовать более дружелюбное имя. Другими словами, во время времени разработки у вас может быть текстовое поле с идентификатором "m_SomeTextBox", и вы хотите иметь возможность писать свой JavaScript с использованием этого же имени - вы просто вызываете этот метод в своем серверный код:
RegisterControlClientID(m_SomeTextBox);
И затем на клиенте отображается следующее:
var m_SomeTextBox = "ctl00_m_ContentPlaceHolder_m_SomeTextBox";
Таким образом, весь ваш код JavaScript может быть довольно не осведомлен о том, что ASP.NET решает назвать эту переменную. Разумеется, для этого есть некоторые предостережения, например, когда у вас несколько экземпляров элемента управления на странице (из-за использования нескольких экземпляров пользовательских элементов управления, в которых у всех есть экземпляр m_SomeTextBox внутри них, например), но обычно этот метод может быть полезным для ваших самых основных потребностей.
Ответ 6
То, что я обычно делаю, это создать общую функцию, которая получает имя поля. Он добавляет обычный префикс asp.net и возвращает объект.
var elemPrefix = 'ctl00-ContentPlaceHolder-'; //replace the dashes for underscores
var o = function(name)
{
return document.getElementById(elemPrefix + name)
}
С этим вы можете использовать этот вид вызовов в jQuery
$(o('buttonId')).bind('click', function() { alert('hi); });
Ответ 7
Вы определенно не хотите жестко закодировать идентификатор сгенерированный asp.net в свой CSS, потому что он может измениться, если вы измените настройки на своей странице таким образом, чтобы ваше дерево управления изменилось.
Вы правы, что идентификаторы CSS имеют свое место, поэтому я проигнорировал бы предложения просто использовать классы.
Различные javascript-хаки, описанные здесь, являются излишними для небольшой проблемы. Так наследуется от класса и переопределяет свойство ID. И, конечно, не рекомендуется предлагать переключиться на MVC, когда все, что вы хотите сделать, это рефакторинг CSS.
Просто у вас есть отдельные div и промежутки, которые вы нацеливаете с помощью CSS. Не обращайтесь непосредственно к элементам управления ASP.NET, если вы хотите использовать идентификаторы.
<div id="DataGridContainer">
<asp:datagrid runat=server id="DataGrid" >
......
<asp:datagrid>
</div>
Ответ 8
Если вы используете jQuery, то у вас есть грузы селекторов CSS и селекторов jQuery custome в вашем распоряжении для целевых элементов на вашей странице. Поэтому вместо того, чтобы выбрать кнопку отправки с помощью id, вы можете сделать что-то вроде:
$('fieldset > input[type="submit"]').click(function() {...});
Ответ 9
Я вижу, как система .NET чувствует себя менее интуитивно понятной, но дайте ей шанс. По моему опыту, на самом деле это приводит к созданию более чистого кода. Конечно,
<asp:button id="ImAButton" runat="server">Click Me</asp:button>
<script type="text/javascript">
var buttonId = <%=ImAButton.ClientId%>
$(buttonId).bind('click', function() { alert('hi); });
</script>
работает отлично. Но это связано с тем, что он не является модульным. То, что вы действительно хотите, это примерно так:
<script type="text/javascript">
function MakeAClick(inid)
{
$(inid).bind('click', function() { alert('hi); });
}
</script>
а затем с вашим кодом на стороне java или на стороне С# вы вызываете MakeAClick. Конечно, на стороне С# это имеет больше смысла, вы просто ClientID там.
Возможно, это настоящая проблема с кодом, который вы просматриваете.
Ответ 10
Намного лучше было бы использовать ClientIDMode и установить его на static
. Вы даже можете установить его для определенной страницы или в глобальном масштабе в файле web.config. Тогда вам больше не придется разбираться с этой проблемой, и ваш JQuery намного чище.
К началу страницы:
<%@ Page Title="" ClientIDMode="Static" Language="C#" CodeBehind="..." Inherits="WebApplication1.WebForm2" %>
Только для управления:
<asp:Panel runat="server" ClientIDMode="Static"></asp:Panel>