Проблема получения.ClientID в ASP.NET C#

У меня есть следующее в JavaScript-функции uploadError для AsyncFileUpload из инструментария AJAX:

function uploadError(sender, args) {
    document.getElementById("<%# uploadResult.ClientID %>").innerText = args.get_fileName(), "<span style='color:red;'>" + args.get_errorMessage() + "</span>";
}

К сожалению ClientID возврат звонка Null, поэтому ошибки JavaScript.

Я также заметил, что ни один из моих элементов управления не имеет обычного формата.NET после загрузки страницы: EG:

<asp:Label runat="server" Text="Select an image to upload it to this stock item...." ID="uploadResult" /> 

Обычно выдает так:

<span id="ctl00_ContentPlaceHolder1_uploadResult">Choose a webstock file to upload...</span>

Но с этим файлом он рендерит как:

<span id="uploadResult">Select an image to upload it to this stock item....</span>

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

5 ответов

Проблема в том, что вы используете <%# синтаксис, который выполняется только при связывании (evals).

Вы должны использовать <%= синтаксис, который всегда будет выполняться.

Например:

function uploadError(sender, args)
{
    document.getElementById('<%= uploadResult.ClientID %>').innerText = 
        args.get_fileName() + "<span style='color:red;'>" + 
        args.get_errorMessage() + "</span>";
}

Ссылка для получения дополнительной информации о встроенном синтаксисе asp.net.

Синтаксис привязки данных

Встроенный синтаксис

РЕДАКТИРОВАТЬ: Обратите внимание, что вы имели , в вашем назначении innerText что также будет проблемой, если это не опечатка.

function uploadError(sender, args) {
    document.getElementById("<%= uploadResult.ClientID %>").innerText = args.get_fileName(), "<span style='color:red;'>" + args.get_errorMessage() + "</span>";

попробуй так

Установить для вашего клиента ClientIDMode="Static"

ИЛИ установить на уровне страницы <%@ Page ClientIDMode="Static"

id советует не применять статические и не ограничивать область действия C# ASP для своих собственных элементов управления, а id советует экранировать специальные символы, например

document.getElementById('/</%= uploadResult.ClientID /%/>').innertext = "xyz or whatever";

если необходимо, поместите его в цикл, итерируйте каждую функцию elementsArr и измените ее на

document.getElementById('/</%= '+ elementsArr[x] +'.ClientID /%/>').innertext = "xyz or whatever";

но наилучшим решением было бы использовать поиск по sizzle (jquery) для всех элементов с идентификатором, начинающимся с ctl00, а для элементов asp по умолчанию всегда добавляется ctl00.

$("id^=ctl00").each(){

// используем функцию this, вызываем идентификатор переменной, затем разделяем на подчеркивания (_)

// вставляем последнее значение в массив... т.е. последний элемент после всех подчеркиваний всегда является действительным идентификатором. и используя sizzle таким образом, вы работаете только с элементами asp, благодаря потрясающему селектору - меньше кода, больше - больше. });

Я действительно прошу прощения за стенографию, но уже поздно, я делал это раньше, и это самый стабильный вариант, который я знаю, вы не можете вызвать какие-либо конфликты, изменяя стандартные спецификации. (ВСЕГДА ПЛОХАЯ ПРАКТИКА, ЧТОБЫ ДЕЛАТЬ ТАК)

Вы можете установить статический режим ClientID или попробовать использовать UniqueID вместо ClientID.

Другие вопросы по тегам