Проблема получения.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.