我刚刚安装了Visual Studio 2015,并打开了我正在工作的ASP.NET项目。我收到了许多错误(都完全相同),如下所示:错误CS0103名称“__o”在当前上下文中不存在实际上,我没有任何名为'__o'的变量,代码工作起来很有魅力(错误是无效的),但困扰我的是,当我的代码真的有错误时,我无法看到它在这个列表中的某个地方,我应该检查整个列表。
iqih9akk1#
我发现如果选择Build Only而不是Build + IntelliSense,则错误(与IntelliSense相关的错误)将消失。
更新1:原因
发生这种情况的原因是,对于这样的代码:
<% if (true) { %> <%=1%> <% } %> <%=2%>
为了在设计时在块中提供IntelliSense,ASP.NET生成对临时__o变量和语言的赋值(VB或C#)然后为该变量提供IntelliSense。这是在页面编译器看到第一个〈%= ... %〉块时完成的。但在这里,该块在if内部,因此在if关闭后,变量超出了作用域。我们最终会生成如下所示的结果:
if (true) { object @__o; @__o = 1; } @__o = 2;
解决方法是在页面的前面添加一个虚拟表达式。
<%=""%>
这将不会呈现任何内容,并且它将确保__o在Render方法中被声明为顶级,在任何潜在的if(或其他作用域)语句之前。
更新2:消除此错误而不丢失其他IntelliSense错误
点击错误列表面板左上角的过滤器按钮,取消选中CS0103其中错误代码为:当前上下文中不存在名称“__o”,这些错误将不再显示,您仍然可以看到其他IntelliSense错误和警告:
o4hqfura2#
阅读了上面注解中给出的链接后,原来是intellisense处理if块的方式。Mikhail Arkhipov在ASP.NET论坛上发布了一个解释和解决方案:我们最终获得了可靠的重现结果,并发现了潜在的问题。一个简单的重现结果如下:
为了在设计时在<%= %>块中提供intellisense,ASP.NET生成对临时__o变量和语言的赋值(VB或C#)然后为变量提供智能感知。这是在页面编译器看到第一个<%= ... %>块时完成的。但在这里,该块在if内部,因此在if关闭后,变量超出了作用域。我们最终会生成如下所示的结果:
<%= %>
__o
<%= ... %>
if
解决方法是在页面的早期添加一个伪表达式。例如<%="" %>。这不会呈现任何内容,并且可以确保在Render方法中将__o声明为顶级,在任何潜在的if(或其他作用域)语句之前。注意到上面的内容,Failure的答案实际上并没有造成太大的伤害,只是隐藏了所有的intellisense错误,这些错误在构建时就已经知道了。参考:http://youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declaredhttps://msdn.microsoft.com/en-us/library/t8zbaa6f.aspx
<%="" %>
nwlls2ji3#
在代码中声明变量__o,如下所示:
public object __o;
请确保将其放在母版页中(* 如果您正在使用母版页 *)。
ztigrdn84#
〈% response.write(var)%〉而不是〈% =var %〉删除了错误,但没有像建议的那样声明__o其他帖子http://forums.asp.net/p/923745/1266105.aspx
2vuwiymt5#
从本质上解决这个问题的方法是在页面的前面添加一个虚拟表达式。例如〈%="”%〉。查看下面的链接以获得进一步的解释:https://forums.asp.net/post/1263727.aspx
v8wbuo2f6#
在我以前的ASP.net MVC项目中,我把这个放在母版页的最上面,它至少在〈%="”%〉没有帮助的一个示例中起了作用:
<script runat="server" type="text/C#"> public object __o; </script>
6条答案
按热度按时间iqih9akk1#
我发现如果选择Build Only而不是Build + IntelliSense,则错误(与IntelliSense相关的错误)将消失。
更新1:原因
发生这种情况的原因是,对于这样的代码:
为了在设计时在块中提供IntelliSense,ASP.NET生成对临时__o变量和语言的赋值(VB或C#)然后为该变量提供IntelliSense。这是在页面编译器看到第一个〈%= ... %〉块时完成的。但在这里,该块在if内部,因此在if关闭后,变量超出了作用域。我们最终会生成如下所示的结果:
解决方法是在页面的前面添加一个虚拟表达式。
这将不会呈现任何内容,并且它将确保__o在Render方法中被声明为顶级,在任何潜在的if(或其他作用域)语句之前。
更新2:消除此错误而不丢失其他IntelliSense错误
点击错误列表面板左上角的过滤器按钮,取消选中CS0103其中错误代码为:当前上下文中不存在名称“__o”,这些错误将不再显示,您仍然可以看到其他IntelliSense错误和警告:
o4hqfura2#
阅读了上面注解中给出的链接后,原来是intellisense处理if块的方式。
Mikhail Arkhipov在ASP.NET论坛上发布了一个解释和解决方案:
我们最终获得了可靠的重现结果,并发现了潜在的问题。一个简单的重现结果如下:
为了在设计时在
<%= %>
块中提供intellisense,ASP.NET生成对临时__o
变量和语言的赋值(VB或C#)然后为变量提供智能感知。这是在页面编译器看到第一个<%= ... %>
块时完成的。但在这里,该块在if
内部,因此在if
关闭后,变量超出了作用域。我们最终会生成如下所示的结果:解决方法是在页面的早期添加一个伪表达式。例如
<%="" %>
。这不会呈现任何内容,并且可以确保在Render方法中将__o
声明为顶级,在任何潜在的if
(或其他作用域)语句之前。注意到上面的内容,Failure的答案实际上并没有造成太大的伤害,只是隐藏了所有的intellisense错误,这些错误在构建时就已经知道了。
参考:http://youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declaredhttps://msdn.microsoft.com/en-us/library/t8zbaa6f.aspx
nwlls2ji3#
在代码中声明变量__o,如下所示:
请确保将其放在母版页中(* 如果您正在使用母版页 *)。
ztigrdn84#
〈% response.write(var)%〉而不是〈% =var %〉删除了错误,但没有像建议的那样声明__o其他帖子
http://forums.asp.net/p/923745/1266105.aspx
2vuwiymt5#
从本质上解决这个问题的方法是在页面的前面添加一个虚拟表达式。例如〈%="”%〉。查看下面的链接以获得进一步的解释:https://forums.asp.net/post/1263727.aspx
v8wbuo2f6#
在我以前的ASP.net MVC项目中,我把这个放在母版页的最上面,它至少在〈%="”%〉没有帮助的一个示例中起了作用: