HTML-код ClientID в .NET-проекте - PullRequest
       19

HTML-код ClientID в .NET-проекте

7 голосов
/ 22 сентября 2008

Если я хочу манипулировать свойствами тега HTML на сервере в пределах страницы aspx на основе главной страницы, т.е.

<a href="#" runat="server" ID="myLink">My Link</a>

Например, чтобы присвоить ссылке другой класс в зависимости от текущей страницы, т.е.

if (Path.GetFileName(Request.PhysicalPath) == "MyPage")
{
myLink.Attributes.Add("class","active");
}

.NET изменяет свойство идентификатора ссылки на что-то вроде

<a href="#" ID="ct100-foo-myLink">My Link</a>

Есть ли способ предотвратить это и сохранить первоначальный идентификатор?

Заранее спасибо

Ответы [ 9 ]

4 голосов
/ 22 сентября 2008

Это невозможно напрямую. Вы можете создать новый элемент управления, который наследует ссылку, и переопределить его ClientID для непосредственного возврата идентификатора. Но это кажется излишним. Вы можете просто использовать HTML-разметку и использовать <% # GetClass ()%> для добавления класса, когда вам это нужно.

Относительно использования ClientID для Javascript:

<a ID="myLink" runat="server">....


var ctrl = document.getElementById('<%# myLink.ClientID %>');

Конечно, вам нужна DataBind где-нибудь в коде.

2 голосов
/ 22 сентября 2008

AFAIK нет пути.

Показывает фактическое дерево управления, которое в данном случае является masterpage-content-control.

Однако, если вы добавите идентификатор на главную страницу (this.ID = «что угодно»), вы увидите «что угодно» вместо ctl00 (что означает контрольный индекс 0).

1 голос
/ 21 октября 2008

Я только что обнаружил простой способ сделать это, если вы используете jQuery.

var mangled_name = $("[id$=original_name]").attr("id");

Итак, если у вас есть такой серверный элемент управления:

<asp:TextBox ID="txtStartDate" runat="server" />

Вы можете получить искаженное имя в вашем jQuery / Javascript с помощью:

var start_date_id = $("[id$=txtStartDate]").attr("id");

Поскольку это строка, вы также можете использовать ее как «встроенную» вместо назначения, например, объединяя его с другими элементами для селекторов.

0 голосов
/ 05 июля 2011

ASP.NET 4 имеет свойство ClientIDMode , которое управляет визуализацией ClientID.

Также есть трюк, как отключить отрисовку ClientID для любого элемента управления без обратной передачи (ASP.NET 2.0 +).

0 голосов
/ 24 сентября 2008

Почему бы просто не использовать стандартный тег и не использовать блоки рендеринга для его изменения, и тогда его поведение заблокировано на клиенте.

0 голосов
/ 22 сентября 2008

Это сообщение в блоге может быть полезным: Удаление искажения имени на главных страницах ASP.Net (верните свой идентификатор!)

Решение в посте перезаписывает метод .getElementById, позволяя вам искать элемент, просто используя обычный идентификатор. Может быть, вы можете адаптировать его к вашим потребностям.

Отказ от ответственности: Такое поведение ASP.NET является конструктивным, и это хорошо, даже для элементов управления HTML-сервера, таких как элемент управления в вашем примере. Server-ID и Client-ID - две совершенно разные вещи, которые не следует смешивать. Используя мастер-страницы или пользовательские элементы управления, вы могли бы получить идентичные идентификаторы клиентов, если бы не было этого механизма.

0 голосов
/ 22 сентября 2008

Да, нам нужно сохранить исходный идентификатор по причинам JavaScript и CSS. Я заметил свойство ClientId, но оно доступно только для чтения и не может быть назначено, поэтому я не уверен, как бы я его использовал?

0 голосов
/ 22 сентября 2008

Я так и не понял, как помешать .NET сделать это, но я начал с размещения asp: Literals и использования c # для добавления к ним WebControl. Если вы пишете WebControl, вы можете устанавливать различные свойства, не получая уникальный идентификатор .NET. Например:

<asp:Literal ID="myLink" />

...

WebControl a = new WebControl(HtmlTextWriterTag.A);
a.CssClass = "active";
a.Attributes["href"] = "#";
Literal text = new Literal();
text.Text = "click here";
a.Controls.Add(text);
myLink.Controls.Add(a);

Что приведет к следующему html:

<a href="#" class="active">click here</a>

В целом, довольно грязное решение, но я не знал, что еще делать в то время, и у меня был крайний срок. ;)

0 голосов
/ 22 сентября 2008

Я так не думаю.

Однако вы, вероятно, захотите сохранить исходное имя, чтобы вы могли манипулировать элементом управления с помощью javascript .... если это так, вам следует обратиться к ClientID; вернет назначенный идентификатор во время выполнения.

РЕДАКТИРОВАТЬ:

Похоже, что есть способ сделать это, но с некоторой работой ... взгляните на Элементы управления ASP.NET - Улучшение автоматической генерации идентификаторов: архитектурные изменения (часть 3)

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

public abstract string SetControlID(string name, System.Web.UI.Control control);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...