我在区域内的控制器遇到困难,这些控制器在不适合该区域的路线上应答请求。所以我有这样的设置(额外的东西削减):
/Areas/Security/Controllers/MembersController.cs
/Areas/Security/SecurityAreaRegistration.cs
/Controllers/HomeController.cs
我的安全区域已定义:
namespace MyApp.Web.Areas.Security
{
public class SecurityAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Security";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Security_default",
"Security/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
}
我的全球路由规则:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*robotstxt}", new { robotstxt = @"(.*/)?robots.txt(/.*)?" });
routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "MyApp.Web.Controllers" }
);
在我的全局asax中,我做了很多事情,但相关的部分是我调用AreaRegistration.RegisterAllAreas();
然后我调用了执行上述操作的路由函数。
但我的问题是对“/ Members /”的请求正在使用我的“默认”路由命中我的会员控制器...即使控制器不在我指定的命名空间中。然后,当它试图运行时,它找不到它的视图,因为它们在区域中定义,并且它试图在整个视图文件夹中找到它们。我尝试制作路由命名空间"Weird.Namespace.With.No.Content"
并且STILL命中成员控制器 - 我找不到任何方法使它不使用该控制器。如何让它不回答不在其区域内的请求?
答案 0 :(得分:7)
通过将路线更改为:
结束寻找解决方案 routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "MyApp.Web.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;
出于某种原因,由于某种原因,它似乎总能找到我的控制器,无论它们在哪里,完全忽略了我的名称空间 - 甚至来自其他引用的程序集。通过DefaultControllerFactory
的ILSpy,看起来GetControllerType
最终会回到绝对每个控制器的搜索状态,如果它没有在您要求的名称空间中找到控制器...
这个标志似乎是在我在特定区域制作的路线上自动设置的,而不是我在全局制作的路线上设置的。当我把它放在全球的时候,他们开始表现我原先的预期。我不知道你为什么要打开它......
答案 1 :(得分:1)
您也应该在您的区域注册名称空间。
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Security_default",
"Security/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new []{ "MyApp.Web.Areas.Security.Controllers"},
);
}
然后确保所有控制器都在适当的命名空间中。
答案 2 :(得分:1)
您是否在注册主要路线后呼叫所有区域?
这是MVC模板的默认片段(请注意区域注册首先如何)
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);