Как избавиться от __o не объявлено?
У меня есть код на моей главной странице, который устанавливает гиперссылку с некоторой конфиденциальной информацией.
<%If Not IsNothing(Profile.ClientID) Then%>
<span class="menu-nav">
<a target="_blank"
href=
"http://b/x.aspx?ClientID=<%=Profile.ClientID.ToString()%>&Initials=<%=Session("Initials")%>"
>
Send
<br />
SMS
<br />
</a>
</span>
<%End If %>
<span class="menu-nav"> <!-- Name __o is not declared Error is flagged here-->
Теперь проблема, похоже, в части href. Если я удалю динамический код, ошибка исчезнет. Может ли кто-нибудь сказать мне, как решить эту проблему?
Ответы
Ответ 1
Я нашел ответ на форумах .net. Он содержит хорошее объяснение того, почему ASP.Net действует так, как оно есть:
Наконец, мы получили надежный репрограммирование и определили основную проблему. Тривиальный ревью выглядит следующим образом:
<% if (true) { %>
<%=1%>
<% } %>
<%=2%>
Чтобы обеспечить intellisense в <% =% > блоках во время разработки, ASP.NET генерирует присвоение временной переменной __o и языку (VB или С#), затем предоставляет intellisense для переменной. Это делается, когда компилятор страницы видит первый блок <% =...% > . Но здесь блок находится внутри if, поэтому после закрытия if эта переменная выходит за пределы области видимости. В итоге получим что-то вроде этого:
if (true) {
object @__o;
@__o = 1;
}
@__o = 2;
Обходной путь заключается в том, чтобы добавить фиктивное выражение на ранней странице. Например. <% = ""% > . Это ничего не даст, и он будет удостовериться, что __o объявлен верхним уровнем в методе Render перед любым потенциальным оператором if (или другим scoping).
Альтернативным решением является простое использование
<% response.write(var) %>
вместо
<%= var %>
Ответ 2
Да, я периодически сталкивался с такой же ошибкой на страницах, которые используют конструкции на стороне сервера на страницах ASPX.
Сверхурочная работа, я нашел исправление для него (извините, мне просто не удалось выяснить, где я снова нашел этот бит информации), и это исправление заключается в том, чтобы поставить следующий код выше errant <%...%>
block:
<%-- For other devs: Do not remove below line. --%>
<%="" %>
<%-- For other devs: Do not remove above line. --%>
По-видимому, где вы помещаете вышеуказанный код, все имеет значение для VS.NET, поэтому может потребоваться несколько попыток сделать это правильно.
Ответ 3
Это странное решение, но для меня мне удалось исправить эту проблему, просто закрыв открытые файлы с нарушением в Visual Studio.
С их открытием я ошибочно получал проблему __o.
Как только я их закрыл, проблема __o исчезла.
Ответ 4
После нескольких часов поиска в Google и анализа кучи aspx'ses в моем текущем проекте, похоже, я нашел решение, которое работает для меня. Не советовал бы сильно избегать комментариев в стиле html:
<!-- ... -->
внутри страницы aspx. Вместо этого используйте комментарии в стиле aspx
<%-- ... --%>
Кроме того, это помогло мне получить, что vs intellisense и подсветка кода снова стали работать, и главным образом - этот случай начался с него - теперь можно ударить по точкам останова внутри встроенных частей кода vb/cs! И никакое проклятое сообщение "Это неверное местоположение для точки останова".
Ответ 5
Когда я очистил решение, перезапустил IIS, и он по-прежнему загадочно разыгрывается, я считаю, что иногда это может быть вызвано вставкой содержимого исходного файла ASPX из другой системы в Visual Studio, который "помогает" обновить код, возможно изменение некоторых идентификаторов и нарушение страницы.
Вставьте его в другой редактор (Notepad ++?), а затем сохраните его, чтобы Visual Studio не "помогала", и страница снова работает.