Подтвердить что ты не робот

Могу ли я остановить идентификаторы .NET для еды?

В настоящее время я являюсь разработчиком информационного архива и JavaScript-разработчиком, но в последнее время я снова возвращаюсь к заднему кодированию. И, пытаясь получить прототип HTML, интегрированный и работающий с CMS на С#, я пришел, чтобы сдуться с нашими программистами над атрибутами HTML ID, которые произвольно переписаны .NET для элементов формы.

Я могу понять аргументы в отношении кода для меняющихся идентификаторов .NET, но тот факт, что вы больше не можете использовать идентификаторы при попытке разработки, например. Усовершенствованные интерфейсы jQuery вызывают некоторое трение. Что я могу сделать, чтобы обойти это?

Я попытался использовать атрибут class вместо этого, но это действительно дерьмово, а не то, для чего это предназначено, и не обойти эту проблему .NET, эффективно меняя предоставляемый источник на лету. Это также означает, что CSS сейчас менее полезен и менее эффективен для создания и поддержки.

Любые советы или советы, которые очень ценят - все для нескольких менее бессонных ночей...

4b9b3361

Ответ 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>