我想避免打电话
AreaRegistration.RegisterAllAreas()
在我的 global.asax 中,因为我试图将所有启动逻辑移动到 App_Start 文件夹内的各个类中。但是,我没有成功地让它工作。第一个选项尝试使用这样的代码:
[assembly: PreApplicationStartMethod(typeof(Startup), "PreInit")]
namespace Foo
{
public class Startup {}
}
PreApplicationStartMethod 来自 System.Web 命名空间。在这种情况下,注册区域的调用发生得太早。
第二种方法,基于David Ebbo 的这篇文章,使用 WebActivator: using System.Web.Mvc;
[assembly: WebActivatorEx.PostApplicationStartMethod
(typeof(AreaDemo.AreaConfig), "RegisterAreas")]
namespace AreaDemo
{
public class AreaConfig
{
public static void RegisterAreas()
{
AreaRegistration.RegisterAllAreas();
}
}
}
不幸的是,虽然没有抛出错误,但尝试导航到该区域会失败(就像从未发生过注册一样)。
使用程序集指令而不是从 Global.asax 直接调用从启动类中注册 ASP.NET MVC 5 中的区域的正确方法是什么?
更新 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 都是 404。