15

ブログ エリアとブログ コントローラーを含むMVC 2 エリアの例を実行すると、URL は次のようになります。

http://localhost:50526/Blog/Blog/ShowRecentの形式:

RootUrl / AreaName / ControllerName / ActionName

MVC エリアを発見したばかりなので、コードを整理するための優れた方法のように思えます。つまり、セクションごとにエリアを作成します。私の場合、各セクションには独自のコントローラーがあります。これは、各 AreaName = ControllerName であることを意味します。これの効果は、上記の/Blog/Blog/などの URL の二重の AreaName/ControllerName パスです。

ルーティングについて完全に明確に理解していない場合、AreaName を表示しないようにルーティングを設定するにはどうすればよいですか?

編集:

これらは互いに影響を与えるように見え (つまり、特定の順序が必要)、大きな頭痛の種になる可能性があるため、ルートを使用した作業量を削減しようとしています :-) 既存の Web フォーム アプリを MVC に変換する際に、いくつかのコア セクションを変換しました。これらにはそれぞれ1つのコントローラーとかなりの量のビュー/アクションがあり、ほとんどのデータアクセスはコードですが、モデル/ビューデータクラスの数は増えています...私は現在、ルートモデル/ビューにサブフォルダーを作成していますこれらのセクション (またはエリア) のフォルダーを作成し、(エリアをカバーする基本的なルートを使用して) コードを整理することを除いて、エリアの作成が同じように機能することを望んでいました) これについて何かコメントはありますか?

4

2 に答える 2

21

各エリアのフォルダ内に*AreaName*AreaRegistration.csファイルが表示されます。これは、エリア ルーティング ルールが保存される場所です。デフォルトでは、それらが生成されると、他のすべてよりも先にエリア名が含まれます。問題は、ルートからエリア名「フォルダー」を削除すると、ルートがすべての「標準」 {controller}/{ をキャッチすることです。 action}/{id} リクエスト。これは明らかにあなたが望むものではありません..

これを克服するために、ルートに存在するコントローラー名に基づいて、ルートに正規表現フィルターを追加できます。欠点は?アプリ内で同じ名前のコントローラーを 2 つ持つことはできません (少なくとも標準ルートを使用しないでください..それらにアクセスする別のルートをいつでも考えることができます:))

最後に..この構造を持つ:

/Areas
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs

あなたが持っているべきものは、次のような sth です:

context.MapRoute(
    "Blog_default",
    "{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new { controller = "(Blog|Feed)" }
);

UserAreaRegistration.cs で:

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

Global.asax.cs で:

public static void RegisterRoutes(RouteCollection routes)
{
    context.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterRoutes(RouteTable.Routes);
}

global.asax エリアでは、登録が最初に行われることに注意してください。:)

UPD: 質問の更新に基づいて: エリアを使用する場合に考慮しなければならない重要な点が 1 つあります: エリア間リンクがある場合は、リンクにエリア名も指定する必要があります. 例えば

<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %>

あなたはアイデアを得る。

複数のモデル/ビューに関しては、現時点ではこのような構造に従っています

/Code/ // ライブラリに移動されないヘルパー、拡張クラス
/Models/Data/ // EF クラス + 検証クラスはここにあります
/Models/ViewModels/{controller}/ // コントローラーごとに格納されたビュー モデル

これまでのところ問題なく動作しており、ソリューションを比較的整理しておくことができました。私が述べたように、私がこれまでに作成した唯一のエリアは、ウェブサイトの他の部分と大きく異なるAdminため、エリアです:)

于 2010-04-21T11:01:39.300 に答える
1

他の誰かがこれを読んでいる場合に備えて、元の質問に答えるために:

[デフォルト] コントローラ ブログに名前を付けないでください。これが、blog/blog {area/controller} を取得する理由です。まったく別の名前を付けることができます。つまり、blog/view、blog/posts、blog/recent など、または home のようなデフォルトの名前を付けることができます。この場合、領域外コントローラーにもホームがある場合は、デフォルトのコントローラーに名前空間を設定する必要があります。

routes.MapRoute("Default",
  "{controller}/{action}/{id}",
  new { controller = "Home", action = "Index", id = UrlParameter.Optional},
  new[] { *appname*.Controllers" });

これにより、「/」と「/blog」が適切な「ホーム」コントローラーに送られるようになります。重複したホームコントローラーエラーを検索すると、これに関する詳細が見つかります.

于 2010-05-11T18:12:23.057 に答える