我有一个实现IRouteConstraint
接口的基类。我正在尝试扩展该类并覆盖基类中定义的Match()
方法。这适用于使用Visual Studio 2013 Update 2的ASP.NET MVC5应用程序。
我的课程结构如下:
\项目\ App_Code文件\ BaseRouteConstraint.cs:
namespace Website {
public class BaseRouteConstraint: IRouteConstraint {
public virtual bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) {
...code
}
}
}
\项目\ App_Code文件\ DerivedRouteConstraint.cs:
namespace Website {
public class DerivedRouteConstraint: BaseRouteConstraint {
public override bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) {
if(!base.Match(httpContext, route, values, routeDirection) {
...code
}
}
}
}
但我实际上无法使用DerivedRouteConstraint类,因为Visual Studio说它不存在。我也收到了这个警告:
'Website.BaseRouteConstraint'中 'C:\ Project \ App_Code \ BaseRouteConstraint.cs'与之冲突 在'C:\ Project \'中导入类型'Website.BaseRouteConstraint'。运用 'C:\ Project \ App_Code \ BaseRouteConstraint.cs'中定义的类型
我已经检查过,并且我没有在解决方案的任何其他地方意外地复制了我的基类的源代码文件。
答案 0 :(得分:5)
我不知道App_Code文件夹不像普通文件夹那样工作。我认为这只是一个放置任何半随机类的地方,它们在项目结构中不一定需要自己的文件夹。当我写这个问题时,我决定尝试将文件移动到另一个(普通)文件夹,一切都开始正常工作。
App_Code文件夹具有特殊功能,其中的所有内容都编译为DLL并自动引用到项目中。有关此文件夹的详细信息,请参阅MSDN页面Shared Code上的“应用程序代码”部分。这篇论坛帖子(http://forums.asp.net/t/1026147.aspx?+What+is+App_Code+Folder+for+)让我觉得代码实际上是引用回到项目中,这对理解错误非常重要。
问题的根源是我更改了类所在的命名空间,因为我不希望它们位于Website.App_Code
命名空间中。因此,当App_Code文件夹中的文件被编译并自动引用到项目时,我在Website
类的BaseRouteConstraint
命名空间中有两个定义。 (一个来自参考App_Code DLL,一个来自代码本身。)
将命名空间更改回Website.App_Code
后,我还将文件的构建选项设置为Compile
而不是Content
(基于此问题:Classes residing in App_Code is not accessible) 。但是,在这种情况下,我认为将文件移动到项目结构中自己的普通文件夹更合适。