我的控制器使用了这样的声明(不确定顺序是否重要)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
我正在尝试访问HTTPContext并注意到我甚至无法获得HTTPContext.Current
似乎有两个HTTPContext变量,MVC就是先例。我必须完全限定对象的命名空间才能让应用程序编译。
答案 0 :(得分:15)
System.Web.HttpContext
是一种具有静态Current
属性的类型,您可以使用它来获取当前上下文。
没有System.Web.Mvc.HttpContext
类型。您可能看到的是Controller
类型公开的HttpContext
属性。此属性为您提供控制器当前正在执行的上下文,并充当获取“当前”上下文的方法。它被认为是优越的,因为您可以为测试控制器注入假上下文,而伪造HttpContext.Current
非常困难。
尽管不完全相关,但使用顺序并不重要:它们都被检查,如果找到两种可能的类型,编译器将抛出关于歧义的异常。重要的是你是否在命名空间声明的内部或外部声明你的使用。编译器首先检查“内部”上下文,这样如果在命名空间中声明类型,则首先检查命名空间内的using语句中的类型,并优先于您自己的类型。如果将using语句移到命名空间之外,则命名空间中的类型将优先。