0

ユーザー、管理者、ショップ、フォーラムなどのエリアを作成しています

各領域には、独自のControllers、Models、Viewsフォルダーがあります。ルートモデル、ルートコントローラー、ルートビューでは、コンポーネントを共有しています。

構造A:

Root/ -> Models/, Controllers/, Views/
Root/User/ -> Models/, Controllers/, Views/
Root/Admin/ -> Models/, Controllers/, Views/
Root/Shop/ -> Models/, Controllers/, Views/
Root/Forum/ -> Models/, Controllers/, Views/

私は間違っているかもしれませんが、各ビジネスロジックグループでMVフォルダとCフォルダを繰り返すのは本当に乾燥しているようには見えません。より良い構造は、メインフォルダーとしてMVとCを使用し、それらの中にビジネスロジックグループをレイアウトすることだと考えていました。

構造B:

Root/Views/ -> User/, Admin/, Shop/, Forum/ ...etc
Root/Models/ -> User/, Admin/, Shop/, Forum/ ...etc
Root/Controllers/ -> User/, Admin/, Shop/, Forum/ ...etc

しかし、このようにフォルダーを構造化すると、Webサイトの論理機能を分割する領域(またはユーザーの観点からはサブフォルダーパス)の機能が失われます。

例えば

構造Aを使用すると、次のことができます。

www.mywebsite.com/Users(area)/Account(controller)/LogOn(action)
www.mywebsite.com/Admin(area)/Account(controller)/LogOn(action) 

同じコントローラー名とアクション名を異なる領域で使用できることに注意してください。

構造Bの場合、私にできる最善のことは次のとおりです。

www.mywebsite.com/AdminAccount(controller)/LogOn(action)
www.mywebsite.com/UserAccount(controller)/LogOn(action)

領域のない単一ワードのサブフォルダーの結果を達成することはできません。それだけではない場合、ここでのコントローラー名はすぐに長くなり、乱雑になる可能性があります。言うまでもなく、同じcontroller.csファイルにスタックするアクションの大きなグループがあります。

それで、とにかく、私のポイントは、構造Bが私にとってより理にかなっていると思った場合、それを達成するためにルーティングを構成するにはどうすればよいですか?

4

1 に答える 1

1

A に対応する URL を持つ構造 B が必要ですか?

構成よりも規則を放棄することになります。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

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

もう 1 つのオプションは、カスタム ルート ハンドラーを作成し、独自の規則を導入することです。次のようなものです (新しい規則では、Users と Account を連結して、www.mywebsite.com/Users/Account/LogOn で UsersAccountController を取得します)。これが領域をどのように処理するかをテストしていませんが、問題がある場合はお知らせください。確認できます。

public class CustomConventionRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
    {
        string controller = requestContext.RouteData.Values["controller"].ToString();

        object controllerModifier;
        if (requestContext.RouteData.Values.TryGetValue("controllerModifier", out controllerModifier))
        {
            requestContext.RouteData.Values["controller"] = string.Concat(controllerModifier, controller);
        }

        return base.GetHttpHandler(requestContext);
    }
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add(
        new Route(
            "{controllerModifier}/{controller}/{action}",
            new RouteValueDictionary(new { controllerModifier = UrlParameter.Optional, controller = "Home", action = "Index" }),  //defaults
            new CustomConventionRouteHandler()));
}
于 2012-07-07T07:48:38.947 に答える