我已经建立了一些ASP.Net MVC网站和他们每个人也有许多适合MVC的控制器和操作页面,和一些是网页真的只是宣传册页面 - /为什么,/为什么/ ouradvantage,/ about等 - 没有实际功能的页面,只是一个视图,也许是一个布局,就是这样。处理手册风格的网页在ASP.Net MVC
对于这些小册子样式的页面,我真的希望只有视图和一个很好的路径来找到它,所以我可以把/ why /宣传册/Why.cshtml或/ Brochure/Why/Index放在/ Why。 cshtml,无论哪种方式,它会被拿起很好。我想避免制作愚蠢的控制器和操作(就像我以前所做的那样)来处理这组URL和页面。
如何在ASP.Net MVC项目中解决这个问题?这一定是一个共同的需求。
编辑:
我可以使用标准的MVC路线({控制器}/{行动}/{ID})和垃圾邮件一堆无用的控制器来:我怎么能做到这一点的详细方式的例子获取我想要的一组网址和网页。每次我想添加一个小册子式(无功能,只是一个视图)页我想添加一个控制器或者动作是这样的:
为什么控制器:
public class WhyController : Controller
{
public ViewResult Index()
{
return View();
}
public ViewResult OurAdvantage()
{
return View();
}
}
这使得在浏览/为什么和/为什么/ ouradvantage - 干净的网址。如果我想要一个/关于页面,我可以添加另一个控制器,它什么都不做,但返回一个名为AboutController的View。如果它有5个子页面,我可以向该控制器添加5个动作,所有这些动作什么也不做,只是返回一个视图。
如果MVC网站,这些宣传册式的网页达说,100多页,我倒是有不少不必要的控制器和动作都做得真的没什么。不是很干。我对将视图放在项目的文件夹中的方式感兴趣,并且让它们可以在干净的URL(例如/ why和/ why/ouradivantage)中访问(通过约定配置)。
有迹象表明,让我靠近的几种方法:
我可以把一堆.cshtml网页,并直接访问他们 - 但是我必须在URL中的文件扩展名和查看文件本身必须坐在根部。
我可以使用ASP.Net领域定义这些的领域,但后来所有的小册子,页面风格都坐至少一个URL段深,我仍然有在URL中的文件扩展名的上述问题。
有我可以定义的疯狂路线。
我怀疑这往往出现在有或大或小数量的这些宣传册,页面风格的MVC项目 - 这好像应该是一个干净的方式来做到这一点。
编辑:垃圾邮件路由引擎的解决方案。
创建一个映射就像路线类:
public static void MapRoutes(RouteCollection routes, string appRoot, string path)
{
if (!path.Contains("~/"))
throw new NotSupportedException("Pages path must be virtual (use ~/ syntax).");
var physicalPath = appRoot + path.Substring(2).Replace("/", "\\");
var dir = new DirectoryInfo(physicalPath);
var pages = dir.GetFiles("*.cshtml", SearchOption.AllDirectories);
int rootLength = appRoot.Length;
var rootParsed = pages.Select(p => "~/" + p.FullName.Substring(rootLength).Replace("\\", "/"));
int folderPathLength = path.Length + 1;
var mapped = rootParsed.Select(p => new {
Url = p.Substring(folderPathLength, p.Length - 7 - folderPathLength),
File = p
});
var routedPages = mapped.Select(m => routes.MapRoute(
name: m.Url,
url: "{*url}",
defaults: new { path = m.File, Controller = "Brochure", Action = "Catchall" },
constraints: new { url = m.Url }
)).ToArray();
}
您可以像RouteConfig称之为:
BrochureRoute.MapRoutes(routes, Server.MapPath("~/"), "~/Brochure");
,所有这些页面的BrochureController,你将需要为明显映射好:
public class BrochureController : Controller
{
public ViewResult Catchall(string path)
{
return View(path);
}
}
2个问题:
- 它像我之前提到的那样对路由引擎进行了垃圾邮件处理 - 如果您有100页,则有100条路由。
- 传递路径如上似乎打乱了正常的剃刀管道 - 以这种方式访问一个页面让你这样的错误:
的观点在“〜/小册子/ About.cshtml”必须派生来自WebViewPage
我不完全理解你想要的行为......请提供路线和结果行为的一些例子在您的文章 – 2013-02-18 21:34:52
@DaveA更新包含的代码更清晰的例子。 – 2013-02-18 22:18:56
我想我明白了。你愿意使用可互换的部分吗?这可以让路线传递部分名称。美丽是你的路由仍然会很好看,你将有多个控制器,每一个单一的视图和无数的谐音每个控制器的专用文件夹视图... – 2013-02-18 22:27:34