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

时间:2014-10-15 14:11:04

标签: asp.net-mvc asp.net-mvc-areas webactivator

我想避免打电话

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。

1 个答案:

答案 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,许多人喜欢这样做,因为它可以帮助避免排序问题。