Подтвердить что ты не робот

Как избавиться от __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. Если я удалю динамический код, ошибка исчезнет. Может ли кто-нибудь сказать мне, как решить эту проблему?

4b9b3361

Ответ 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 не "помогала", и страница снова работает.