tags:

views:

710

answers:

2

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=&lt;%=Profile.ClientID.ToString()%&gt;&amp;Initials=&lt;%=Session("Initials")%&gt;"       
    >
    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?

+3  A: 

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.

Cerebrus
Even if I already had other `<%=myVarialble%>` before the first `<% If ... Then %>` statement, I got this problem, but including it another place solved it. I tried different places, and it was not consistent in what kind of place where it failed and where it worked, so you are very right. It is required to try different places to get it to work. I placed it directly after `<form id="form1" runat="server">` which will probably be a good place in most cases.
awe
Thanks for that useful comment, @awe!
Cerebrus
+5  A: 

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

[quote]

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.

[/quote]

An alternative solution is to simply use

<% response.write(var) %>

instead of

<%= var %>
Peter
http://forums.asp.net/p/923745/1266105.aspx
John Nolan