1

マイセットアップ

通常の方法でコントローラーのセットがあり、その中に通常の CRUD アクション メソッドがあります。これらの管理者の例は、証言、ギャラリー、FAQ です。これらには、それぞれ Testimonial、Gallery、FAQ などの Entity Framework のバッキング モデルがあります。

これらには、次のような URL でアクセスできます: /Galleries/Edit/2 ここまではすべて問題なく、すべて既定の規則で...

また、編集可能なコンテンツを含める必要がある一連のページもあり、これらには Entity Framework を介してデータベースからコンテンツが取り込まれています。その背後で「ページ」と呼ばれる EF モデルを使用します。これには content プロパティ (html) と name プロパティがあり、着信要求を照合できます。これらのページは、ホーム、概要、および価格のページです。

これを行うためにホームコントローラーを選択しました-名前パラメーターによってDBからどのページをロードするかをインデックスアクションに解決させるつもりです:

 [AllowAnonymous]
    public ActionResult Index(string name = "Home")
    {
        // look up the page by name in the DB.
        var model = context.Pages.FirstOrDefault(p => p.Title == name);

        // trap errors.
        if (model == null)
        {
            return RedirectToAction("NotFound", "Error", new { aspxerrorpath = name } );
        }

        // normal path
        return View(model);
    }

したがって、理論的には新しい項目を Pages テーブル/DbSet に追加することができ、これらはこのコントローラーとアクションに適切にマップされます。次に、上記のインデックス アクションと同じ署名を持つコンテンツを編集するために、管理者用の編集アクションを追加します。


問題

問題はルーティングリクエストに付属しています...

2 つの初期ルートがありました。

routes.MapRoute("DynamicAccess",
                "{name}/{action}",
                new { controller = "Home", action = "Index" });

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

これは、毎回ホームコントローラーを通過するため、「ギャラリー/」に移動すると失敗し、それらを交換すると失敗します。また、ホームコントローラーにも Scripts/ フォルダーのリクエストを取得していました....


私の一時的な解決策

現在のルートは次のようになります。

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("favicon.ico");

        routes.MapRoute("Gallery",
                        "Gallery/{action}/{id}",
                        new { controller = "Galleries", action = "Index", id = UrlParameter.Optional });

        routes.MapRoute("Testimonials",
                        "Testimonials/{action}/{id}",
                        new { controller = "Testimonials", action = "Index", id = UrlParameter.Optional });

        routes.MapRoute("FAQs",
                        "FAQs/{action}/{id}",
                        new { controller = "FAQs", action = "Index", id = UrlParameter.Optional });

        routes.MapRoute("DynamicAccess",
                       "{name}/{action}",
                       new { controller = "Home", action = "Index" });

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

        routes.MapRoute("Root",
                        "",
                        new { controller = "Home", action = "Index" });


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

ここで、動的に解決されるホーム ルートのルートの上に、静的ページごとにルートを宣言する必要があることがわかります。


質問

これは私には不器用に見えます-動的ではない各ページをルートテーブルに追加する必要があります。誰かがこれを行うためのよりクリーンな方法を教えてもらえますか?

前もって感謝します。

4

1 に答える 1

0

スタティック ルートに制約を設定して、一致しないルートがダイナミック ルートに落ちることを許可しないのはなぜですか?

routes.MapRoute("default",
                "{controller}/{action}/{id}",
                new {controller="home", action="index", id=UrlParameter.Optional},
                new {controller="^(|home|gallery|testimonial|faq)$"});

routes.MapRoute("dynamic",
                "{name}/{action}",
                new {controller="home", action="index"});

制約内の単数形の名前に一致するようにコントローラーを変更する必要がありますが、それ以外は機能するはずです。

于 2013-09-10T09:07:22.967 に答える