2

アプリケーションの起動時にアクション (表示されるページ) がルート構造ではなく、選択した特定の領域に配置されるように、アプリケーションを構成する方法と場所を教えてください。

Action = " IndexOfArticles "、Controller = " Articles "、Area = " News "としましょう。アプリケーションを起動したときに、この設定をデフォルトにしたいです。

私はNewsAreaRegistrationクラスに取り組み、上記の構成をセットアップしました。今、それを機能させるには、Global.asx.cs でも何かをする必要があると思いますが、何をすべきかわかりません。

編集

これが私の言いたいことです

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

たとえば、上記のコードでは、 HomeコントローラーにあるIndexアクションを実行してアプリケーションを開始します。それは私が望むものではありません。助けてくれてありがとう。

4

2 に答える 2

3

あなたが尋ねてきた質問の性質を考慮して、あなたが本当に気に入ると思うリソースをお勧めしたいと思います. スティーブン サンダーソンの著書「Pro ASP.NET MVC 2 フレームワーク (第 2 版)」apress から。特に第 8 章では、ルーティングとエリアについて詳しく説明します。本自体は素晴らしく、徹底しています。私が今まで読んだ開発/プログラミング本の最高の例の 1 つです。Kindle形式で入手でき、apressに直接注文するとPDF電子書籍形式で入手できます. もちろん、紙の形でも入手できます。

アマゾンリンク

また

アプレス直送

領域について理解したいと思うかもしれない具体的なことは、領域が名前空間に基づいているということです。エリアを作成するとき、そのエリアの名前空間は、MVC がそれらを見つける方法であり、何が「内」にあり、何がエリアにないかを決定します。一般に、これは、URL の最初のフォルダーとしてエリアの名前を持つ URL を介してエリアへのルーティングが行われることを意味しますが、これは必ずしも物理フォルダー名ではなく、コントローラーの名前空間にマップされます (ただし、正気)。

Manaf の例のルートは、意図的というよりも「偶然」に機能しています。「ルート領域」(つまり、領域内にないコントローラーのフォルダー) にあいまいなコントローラー名がある癖があります。ルートがルート エリアにつながるが、そこでコントローラーが見つからない場合、すべてのエリアをスキャンして一致を探します。この場合、ニュース名前空間で一致を見つけて動作します。ただし、このスキャンは、一致するコントローラーが 1 つしかない場合にのみ機能します。したがって、同じ名前の別の領域に別のコントローラーを作成すると、「複数のタイプが見つかりました」という種類の例外で失敗します。

これをより確実に機能させるには、2 つの良い方法があります。ルート内のニュース エリアを優先するか、リダイレクトするかのいずれかによって:

リダイレクション:

ルート要求を特定の領域のコントローラーにルーティングする代わりに、ブラウザーを開始したい領域の URL にリダイレクトできます。したがって、それらは「yoursite.com/」から始まり、「yoursite.com/news/articles」の URL にリダイレクトされます。これを行うには、ルート レベルのコントローラーを作成し、デフォルト ルートを使用します。そのため、HomeController をルート コントローラー フォルダー (領域内ではなく) に作成します。そのコントローラーで、Index というアクション メソッドを作成します。そして、その Index メソッドで、それらを本当に開始したいコントローラーにリダイレクトします。

global.asax では、次のような非常に標準的なデフォルト ルートに依存できます。

routes.MapRoute(    
     "Default",  
     "{controller}/{action}/{id}",  
     new { controller = "Home", action = "Index", id = UrlParameters.Optional }  
); 

Home コントローラーの Index アクションで、RedirectToAction を使用して領域を指定し、クライアントをニュース領域の正しいコントローラーにリダイレクトするだけです。

return RedirectToAction("IndexOfArticles", "Articles", new { area = "News" });

2 番目の手法は、ルートに優先順位を付けて、使用するエリアを認識できるようにすることです。これには、ルート レベルのコントローラーは必要ありません。次のようなルート エントリを追加するだけです。

routes.MapRoute(
    "Default",
    "{controller}/{acion}/{id}",
    new {controller = "Articles", action = "IndexOfArticles", id = UrlParameters.Optional},
    new[] {"YourApplication.News"}
);

これの欠点は、4 番目のパラメーター (名前空間) がすべての要求に適用されるため、必要以上に特定のニュース エリアにリダイレクトされる可能性があることです。このルートが他のリクエストをキャッチしないように、2 番目のパラメーターをより具体的にする方がよい場合があります。おそらく、2 番目のパラメーターを空の文字列に設定して、サイト ルート リクエストのみをキャッチします。

于 2010-09-10T13:08:54.923 に答える
2

エリアへのカスタム ルートは、AreaRegistration クラスに登録する必要があります。Global.asx.cs にはありません。

NewsAreaRegistrationルートを追加するには、エリア ルートの後に新しいデフォルト ルートをサーバーに変更して追加します。(ここでは順番が重要です!)

より具体的なルートを照合できるように、デフォルト ルートは常にルーティング テーブルの一番下にある必要があります。

メソッド内のルートは次のRegisterAreaようになります。

        context.MapRoute(
            "News_default",
            "News/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );

        context.MapRoute(
            "DefaultStart",
            "",
            new { controller = "Articles", action = "IndexOfArticles"}
        );

更新Application_Start: Global.asx.cs ファイルのメソッドで領域を登録したことを確認する必要があることを忘れていました。

AreaRegistration.RegisterAllAreas();

更新 2: ASP.NET MVC でのルーティングのしくみ

私はあなたの懸念を理解しています。ルーティングのしくみを簡単に説明します。

ASP.NET MVc には、すべての URL 要求に一致するために使用されるルーティング テーブルが 1 つあります。

Global.asx.cs または AreaRegistration にルートを登録すると、それらのルートは、登録された順序でルーティング テーブルに追加されます (そのため、順序が重要であり、より具体的なルートを一番上にプッシュする必要があります。マッチングできます)。

エリアルート(AreaRegistrationクラスに登録されているルート)の場合。これらは常に、Global.asx.cs ファイルに登録されているルートの前にルーティング テーブルの先頭に追加されます (エリア ルートが最初に一致するルートです)。 News という名前のコントローラー。

複数のエリアがある場合、どのエリアのルートが最初にチェックされますか? 100% 確実ではありませんが、実験によって、それらが作成時間順に並べられていることがわかりました。古い領域がルーティング テーブルの一番上に来ます。(同じ名前のエリアが 2 つ存在しないため、特に問題はありません)

例:

次の領域を作成したとします。NewsDashboardApi

上記の例のように、ルートルートと一致するように、次のルートを NewsAreaRegistration に追加しました

context.MapRoute(
        "DefaultStart",
        "",
        new { controller = "Articles", action = "IndexOfArticles"}
    );

ルーティング テーブルは次のようになります。

No   Route Name                        URL                               Explanation 
1   News_default         News/{controller}/{action}/{id}          Default For News Area
2   DefaultStart         (empty)                                  Root Route (match root url)
3   Dashboard_default    Dashboard/{controller}/{action}/{id}     Default For Dashboard Area
4   Api_default          Api/{controller}/{action}/{id}           Default For Api Area
5   Default              {controller}/{action}/{id}               Default (No Areas)

アプリケーションがリクエストを受け取ったとき。ルートを 1 つずつ調べて一致を探します。私たちの場合、ルート URL をリクエストするとき。2 番目のルートが一致します。controller = "Articles" と action = "IndexOfArticles" のデフォルト値を設定しているため、リクエストはそれに応じてリダイレクトされます。

お役に立てば幸いです。

于 2010-09-09T12:11:35.137 に答える