4

こんにちは、複雑な問題を回避する必要があるように思われますが、解決できると確信しています。C# でコンテンツを動的に管理する MVC4 アプリケーションを作成する必要があります。コントローラーを作成してビューにマッピングする方法は理解していますが、これを動的に行う方法がわかりません。シナリオは次のとおりです。

ユーザーが CMS に入り、Web サイトのルート内の新しいフォルダーに仮想タイプのページを作成します。このフォルダーとページは、私の MVC アプリケーションには存在しません。新しいページにアクセスするための URL は、website.com/newfolder/newpage のようになります。ユーザーが新しいページで読み込むビューとして選択する全幅のページ ビューがあります。

したがって、私の質問は、上記の URL を取得して正しいビューを提供し、URL 構造を動的に保持できる MVC コントローラーとアクションを作成する方法です。私はいくつかのことを読みましたが、それらは私がやろうとしていることではないようです.

どんな助けでも素晴らしいでしょう。

乾杯

更新 29/09/2015 以下にコメントして、最終的にこれがどのように行われたかを尋ねる場合は、ルート構成と動的コントローラーのコードを以下に示します。

ルート設定

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

        routes.MapRoute(
            name:"Gallery",
            url: System.Configuration.ConfigurationManager.AppSettings["gallerycontroller"] + "{id}", 
            defaults: new { controller = "Component", action = "Gallery", id = UrlParameter.Optional });

        routes.MapRoute(
            name: "ContactForm",
            url: System.Configuration.ConfigurationManager.AppSettings["contactcontroller"] + "{action}/{id}",
            defaults: new { controller = "ContactUs", action = "ContactForm", id = UrlParameter.Optional });

        routes.MapRoute(
            name: "Dynamic", url: "{*page}", defaults: new { controller = "Master", action = "Load", page = UrlParameter.Optional}
            );

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

マイ ダイナミック ページ コントローラー

    public class MasterController : Controller
{

    public ActionResult Load(string page)
    {
        if (page == null)
        {
            //load default page
            ContentDelivery _cd = new ContentDelivery(System.Configuration.ConfigurationManager.AppSettings["ContentDelivery"]);
            ContentPage _cp = _cd.GetPage(1);
            if (_cp != null)
            {
                string _view = "PageViews/" + _cp.PageView;
                return View(_view, _cp);
            }
            else
            {
                return View("PageViews/404Page");
            }
        }
        else
        {
            ContentDelivery _cd = new ContentDelivery(System.Configuration.ConfigurationManager.AppSettings["ContentDelivery"]);
            ContentPage _cp = _cd.GetPage(page);
            if (_cp != null)
            {
                string _view = "PageViews/" + _cp.PageView;
                return View(_view, _cp);
            }else{
                return View("PageViews/404Page");
            }

        }

    }

}

明らかに、サービス レイヤーと動的コンテンツ用のデータベースでさらに多くのコードが実行されていますが、誰かの役に立てば、これも共有できます。

ありがとう

4

1 に答える 1

2

すべての動的ページに対して呼び出されるメソッドが 1 つだけで、動的ページが実際にカスタマイズ可能なビューである場合は、ルーティングを使用してこれを実現できます。実際のマッピングを次のように変更するだけです。

routes.MapRoute( null, "{folder}/{page}", defaults: new { controller = "Dynamic", action = "Load", folder = "", page = "" } );

また、フォルダーとページがデータベースに存在するかどうかを確認するルートに制約を追加する必要があります(その情報をデータベースに保存していると思います)

カスタム ルーティングについては、この投稿をご覧ください: http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-custom-routes-cs

また、コントローラーメソッドにはパラメーターfolderpageパラメーターが必要です。

于 2013-05-03T16:06:29.467 に答える