嗨,我有一个似乎是一个复杂的问题,但我相信它可以做到。我需要在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");
}
}
}
}
显然,我的服务层和数据库中有更多代码用于动态内容,但如果对任何人都有帮助,我也可以分享这些代码。
由于
答案 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
您的控制器方法也应该包含folder
和page
参数。