5

電話するのは避けたい

AreaRegistration.RegisterAllAreas()

すべてのスタートアップ ロジックを App_Start フォルダー内の個々のクラスに移動しようとしているためです。しかし、私はこれを機能させることに失敗しました。最初のオプションは、次のようなコードを使用しようとしました。

[assembly: PreApplicationStartMethod(typeof(Startup), "PreInit")]
namespace Foo
{
  public class Startup {}
}

PreApplicationStartMethod は System.Web 名前空間から来ています。この場合、領域を登録する呼び出しが早すぎます。

David Ebbo によるこの投稿に基づく 2 番目のアプローチでは、 WebActivator を使用します。

    [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などのイベントの処理を試みることができます。登録は一度だけ行います (つまり、すべての要求に対して何かを登録しないでください!)。そうすれば、ASP の前に忍び込むことができるはずです。 .NET ルーティングはその処理を行います (これは少し後で、 中に発生します)。BeginRequestPostResolveRequestCache

これに代わる完全な方法は、属性 routesを使用することです。これは、順序付けの問題を回避できるため、多くの人に好まれています。

于 2014-10-25T23:00:14.033 に答える