Явно определить префикс управления в ASP.NET 1.1? - PullRequest
3 голосов
/ 15 августа 2011

У меня есть (плохо написанный) устаревший код, который мне нужно изменить, но у меня странная проблема с префиксом элементов управления.

На главной странице есть несколько включаемых файлов, включая cpct_cost.aspx. На этой странице есть элемент управления. Стоимость оборудования:

<INPUT id="EquipmentCost" type="text" name="EquipmentCost" runat="server" size="10" onchange="TotalCost();" class="bk">

Ссылки на другую страницу, которые управляют в javascript на стороне клиента:

function TotalCost()
{
    var a = document.CPCT_FORM.cpct_cost_EquipmentCost.value;

Это приводит к ошибке клиента, потому что когда я запускаю код локально, элемент управления получает имя $ вместо _:

<input name="cpct_cost$EquipmentCost" type="text" id="cpct_cost_EquipmentCost" size="10" onchange="TotalCost();" class="bk" />

И в результате на стороне клиента javascript не может найти рассматриваемый элемент.

Устаревший код на сервере обрабатывает это по-другому - имя элемента управления там обрабатывается как:

<input name="cpct_cost:EquipmentCost" id="cpct_cost_EquipmentCost" type="text" size="10" onchange="TotalCost();" class="bk" />

и это обрабатывается правильно.

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

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

В настоящее время проект находится в списке предложений, который будет полностью реархитирован (поэтому, пожалуйста, никаких предложений по изменению дизайна приложения;)), но в то же время у меня есть краткосрочное требование для реализации некоторых незначительных новых функций в этом уродливом старый зверь, и я должен сделать это как можно скорее. Что расстраивает - я не изменил эти части кода вообще , но поведение все равно меняется.

UPDATE

Очевидно, префикс именования, используемый по крайней мере в .NET 1.1, несколько случайный, потому что после нескольких сборок, когда я пытался обойти это, элементы управления в итоге получили правильное имя. Так что теперь я просто не изменяю код, который отстой, потому что я очень не хочу использовать этот подход "заморозить, пока он случайно не правильный".

Ответы [ 2 ]

2 голосов
/ 19 августа 2011

Вы можете передать ссылку на элемент управления вводом в качестве параметра функции JS, то есть:

<INPUT id="EquipmentCost" type="text" name="EquipmentCost" runat="server" size="10" onchange="TotalCost(this);" class="bk">

function TotalCost(txtEquipCost) {
var a = txtEquipCost.value;
}

Тогда не имеет значения, какой это идентификатор.

РЕДАКТИРОВАТЬ:
Если у вас есть больше элементов управления, создайте на странице переменные JS, например:

var txtEquipCost = document.getElementById('<%= YourControl.ClientID %>');
var txtOtherCost = document.getElementById('<%= YourOtherControl.ClientID %>');

Тогда вызов функции onChange может быть TotalCost (txtEquipCost, txtOtherCost)

EDIT2:
См. Этот вопрос о ClientId и UniqueId, который может быть полезен: C # asp.net Почему существует разница между ClientID и UniqueID?

2 голосов
/ 15 августа 2011

Вы можете изменить свой Javascript для использования генерируемого идентификатора.

function TotalCost()
{
    var a = document.getElementById('<%= YourControl.ClientID %>').value;
}

Также, если вам нужен абсолютный контроль над сгенерированным идентификатором этого элемента управления, выясняется, что в asp.net 4.0 было введено свойство ClientIDMode, чтобы разработчики имели больше контроля над тем, как генерируется этот идентификатор.

Проверьте эти два источника

http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientid.aspx

http://weblogs.asp.net/asptest/archive/2009/01/06/asp-net-4-0-clientid-overview.aspx

...