How do i get rid of __o is not declared?

Viewed 20437

I have some code in my master page that sets up a a hyperlink with some context sensitive information

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

Now the issue seems to be in the href part. If I remove the dynamic code the error disappears. Can anyone tell me how to resolve this issue?

5 Answers

I've found the answer on the .net forums. It contains a good explanation of why ASP.Net is acting the way it is:

We have finally obtained reliable repro and identified the underlying issue. A trivial repro looks like this:

  <% if (true) { %>
  <%=1%>
  <% } %>
  <%=2%>   

In order to provide intellisense in <%= %> blocks at design time, ASP.NET generates assignment to a temporary __o variable and language (VB or C#) then provide the intellisense for the variable. That is done when page compiler sees the first <%= ... %> block. But here, the block is inside the if, so after the if closes, the variable goes out of scope. We end up generating something like this:

   if (true) { 
        object @__o;
        @__o = 1;
   }
   @__o = 2;

The workaround is to add a dummy expression early in the page. E.g. <%="" %>. This will not render anything, and it will make sure that __o is declared top level in the Render method, before any potential ‘if’ (or other scoping) statement.

An alternative solution is to simply use

<% response.write(var) %>

instead of

<%= var %>

Yes, I have experienced the same bug occasionally in pages that use server side constructs on ASPX pages.

Overtime, I found a fix for it (I'm sorry, I just haven't been able to find out where I found this bit of info again.) and that fix is to put the following code above the errant <%...%> block:

<%-- For other devs: Do not remove below line. --%>
<%="" %>
<%-- For other devs: Do not remove above line. --%>

Apparently, where you put the above code makes all the difference to VS.NET, so it may take a few tries to get it right.

When I've cleaned the solution, restarted IIS and it is still mysteriously playing up, I find this can sometimes be caused by pasting an ASPX source file's contents from another system into Visual Studio which "helpfully" updates the code, possibly changing some IDs and breaking the page.

Pasting it into another editor (Notepad++?) then saving it stops Visual Studio from "being helpful" and the page works again.

Related