我怎么摆脱__o没有声明?

Joh*_*lan 52 asp.net

我的母版页中有一些代码,用于设置带有一些上下文敏感信息的超链接

<%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-->
Run Code Online (Sandbox Code Playgroud)

现在问题似乎在href部分.如果我删除动态代码,则错误消失.谁能告诉我如何解决这个问题?

Pet*_*ter 69

我在.net论坛上找到了答案.它包含了一个很好的解释,为什么ASP.Net的行为方式如下:

我们终于获得了可靠的复制品并确定了潜在的问题.一个琐碎的repro看起来像这样:

  <% if (true) { %>
  <%=1%>
  <% } %>
  <%=2%>   
Run Code Online (Sandbox Code Playgroud)

为了在设计时在<%=%>块中提供intellisense,ASP.NET生成对临时__o变量和语言(VB或C#)的赋值,然后为变量提供intellisense.当页面编译器看到第一个<%= ...%>块时,就会这样做.但是在这里,块在if中,所以在if关闭之后,变量超出了范围.我们最终生成这样的东西:

   if (true) { 
        object @__o;
        @__o = 1;
   }
   @__o = 2;
Run Code Online (Sandbox Code Playgroud)

解决方法是在页面的早期添加虚拟表达式.例如<%=""%>.这不会呈现任何内容,并且它将确保在任何可能的'if'(或其他作用域)语句之前,在Render方法中将__o声明为顶级.

另一种解决方案是简单地使用

<% response.write(var) %>
Run Code Online (Sandbox Code Playgroud)

代替

<%= var %>
Run Code Online (Sandbox Code Playgroud)


Cer*_*rus 15

是的,我偶尔会在使用ASPX页面上的服务器端构造的页面中遇到相同的错误.

加班,我找到了一个修复程序(对不起,我只是无法找到我再次找到这些信息的位置.)并且修复是将以下代码放在错误的<%...%>块上方:

<%-- For other devs: Do not remove below line. --%>
<%="" %>
<%-- For other devs: Do not remove above line. --%>
Run Code Online (Sandbox Code Playgroud)

显然,你把上面的代码放在VS.NET中会有所不同,所以可能需要几次尝试才能正确完成.