如何使用app_start或webactivator注册区域?

ssm*_*ith 5 asp.net-mvc asp.net-mvc-areas webactivator

我想避免打电话

AreaRegistration.RegisterAllAreas()

在我的global.asax中,因为我试图将所有启动逻辑移动到App_Start文件夹中的各个类中.但是,我没有成功地让它发挥作用.第一个选项尝试使用这样的代码:

[assembly: PreApplicationStartMethod(typeof(Startup), "PreInit")]
namespace Foo
{
  public class Startup {}
}
Run Code Online (Sandbox Code Playgroud)

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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,尽管没有抛出错误,但尝试导航到该区域失败(好像注册从未发生过).

使用程序集指令而不是从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" }
            );
    }
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,默认值被忽略,但导航到/ admin/home/index/0有效./ admin,/ admin/home和/ admin/home/index全部404.

Eil*_*lon 0

我认为这是一个订购问题(您似乎也怀疑这一点)。我认为这些区域是在活动之后注册的,因此Application_Start区域的路线是在非区域路线之后注册的。

4 段 URL ( ) 起作用的原因/admin/home/index/123是它无法匹配 MVC 应用程序的“默认”路由。因此,该默认路由将被跳过(因为它仅匹配 1、2 和 3 段 URL),并且路由将查找可以处理 4 段 URL 的特定于区域的路由。1、2 或 3 段 URL 将匹配非区域路由,但当然区域之外没有控制器来处理此类 URL,因此返回 404。

Application_Start如果我理解正确的话,您希望在 之后但在发生任何“其他”事情之前注册这些区域?不幸的是,我不知道有任何具体的事件来处理这个问题。您也许IHttpModule可以尝试处理诸如 之类的事件BeginRequest,该事件发生得非常早,只需快速注册一次(也就是说,不要在每个请求上注册内容!),这应该允许您在 ASP 之前潜入.NET 路由完成它的工作(稍后发生,在 期间PostResolveRequestCache)。

一个完整的替代方案是使用属性route,很多人喜欢它,因为它可以帮助避免排序问题。