创建动态MVC控制器,动态页面的操作

时间:2013-05-03 13:31:18

标签: c# asp.net-mvc

嗨,我有一个似乎是一个复杂的问题,但我相信它可以做到。我需要在C#中创建动态内容托管的MVC4应用程序。我理解如何创建我的控制器并将它们映射到视图,但我无法弄清楚如何动态地执行此操作。场景如下:

用户进入CMS并在网站根目录下的新文件夹中创建虚拟类型页面。我的MVC应用程序中不存在此文件夹和页面。访问新页面的URL类似于website.com/newfolder/newpage。我有一个全宽页面视图,用户选择该视图作为要加载新页面的视图。

所以我的问题是如何创建一个MVC控制器和动作,可以获取上面的url并为我提供正确的视图并动态保持url结构。我已经阅读了一些内容,但它们似乎并不是我想要做的事情。

任何帮助都会很棒。

干杯

更新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");
            }

        }

    }

}

显然,我的服务层和数据库中有更多代码用于动态内容,但如果对任何人都有帮助,我也可以分享这些代码。

由于

1 个答案:

答案 0 :(得分:2)

如果每个动态页面只调用一个方法,并且您的动态页面实际上是可自定义的视图,则可以使用路由来实现此目的。只需将实际映射更改为具有以下内容:

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参数。