Проблема получения .ClientID в ASP.NET C # - PullRequest
2 голосов
/ 22 августа 2011

У меня есть следующее в 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 после загрузки страницы: E.G.:

<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 ]

8 голосов
/ 22 августа 2011

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

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

Например:

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

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

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

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

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

1 голос
/ 29 августа 2013

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, благодаря потрясающему селектору: меньше кода, больше работы. });

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

1 голос
/ 22 августа 2011

набор для вашего клиента ClientIDMode="Static"

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

1 голос
/ 22 августа 2011
function uploadError(sender, args) {
    document.getElementById("<%= uploadResult.ClientID %>").innerText = args.get_fileName(), "<span style='color:red;'>" + args.get_errorMessage() + "</span>";

попробуй вот так

0 голосов
/ 22 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...