5

我想避免打电话

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。

4

1 回答 1

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 Routing 完成了它的工作(稍后发生,在 期间PostResolveRequestCache)。

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

于 2014-10-25T23:00:14.033 回答