4

嗨,我有一个似乎很复杂的问题要解决,但我确信它可以完成。我需要在 C# 中创建一个动态内容管理的 MVC4 应用程序。我了解如何创建我的控制器并将它们映射到视图,但我不知道如何动态地执行此操作。场景如下:

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

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

任何帮助都会很棒。

干杯

2015 年 9 月 29 日更新 对于那些在下面评论以询问最终是如何完成的,我的路由配置和动态控制器的代码如下。

路由配置

    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

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

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 回答