我想避免打电话
AreaRegistration.RegisterAllAreas()
在我的global.asax中,因为我试图将所有启动逻辑移动到App_Start文件夹中的各个类中。但是,我没有成功地开始工作。第一个选项尝试使用这样的代码:
[assembly: PreApplicationStartMethod(typeof(Startup), "PreInit")]
namespace Foo
{
public class Startup {}
}
PreApplicationStartMethod来自System.Web命名空间。在这种情况下,对寄存器区域的调用过早发生。
第二种方法基于this post by David Ebbo,使用WebActivator: 使用System.Web.Mvc;
[assembly: WebActivatorEx.PostApplicationStartMethod
(typeof(AreaDemo.AreaConfig), "RegisterAreas")]
namespace AreaDemo
{
public class AreaConfig
{
public static void RegisterAreas()
{
AreaRegistration.RegisterAllAreas();
}
}
}
不幸的是,尽管没有抛出错误,但尝试导航到该区域失败(就好像注册从未发生过一样)。
使用程序集指令从启动类注册ASP.NET MVC 5中的区域的正确方法是什么,而不是从Global.asax直接调用?
更新1:这是我的AreaRegistration代码:
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "AreaDemo.Areas.Admin.Controllers" }
);
}
}
由于某种原因,默认值被忽略,但导航到/ admin / home / index / 0可以正常工作。 / admin,/ admin / home和/ admin / home / index all 404。
答案 0 :(得分:0)
我认为这是一个订购问题(你似乎也怀疑它)。我认为这些区域在 Application_Start
事件之后已经注册,因此区域的路线在非区域路线之后注册。
4段网址(/admin/home/index/123
)的工作原因是它无法匹配MVC应用的“默认”路由。因此,跳过该默认路由(因为它仅匹配1,2和3段URL),并且路由将找到可以处理4段URL的区域特定路由。 1区段,2区段或3区段URL将与非区域路由匹配,但当然区域外没有控制器来处理此类URL,因此返回404。
如果我理解正确,您希望在Application_Start
之后注册区域,但在“其他”发生之前?不幸的是,我不知道有任何特定的事件要处理。从IHttpModule
开始,您可以尝试处理BeginRequest
这样的事件,这种事件发生得非常早,很快就会在那里注册一次(也就是说,不要在每个上注册东西 request!),这应该允许你在ASP.NET Routing完成它的工作之前潜入(稍后发生,PostResolveRequestCache
期间)。
完全替代方法是使用attribute routes,许多人喜欢这样做,因为它可以帮助避免排序问题。