我试图创建一个非常简单的应用程序,让我的客户端创建自己的页面。 困难的部分是让他们创建自己的URL。
客户需要填写:
当客户输入此信息并保存时,应将其保存在数据库中。
我可以轻松创建名为“Page”的控制器,其值为“ID”,当用户输入“www.someurl.com/Page/1”时,弹出新创建的页面。
但我真正想要的是让用户写“www.someurl.com/About”,然后弹出页面。
如何使用ASP MVC使用某种动态重写/路由代码来完成。
答案 0 :(得分:7)
由于此站点上有关路由的问题数量表明,即使对于程序员来说,正确处理多个可能重叠的路由也很棘手。将这种广泛的功能放在最终用户手中是可怕的。
要回答您的问题,在应用程序启动时从数据库中读取“自定义”路径并照常映射它们相当简单。您通常不会在应用程序执行期间执行此操作,因为路由列表将在多个线程之间共享。如果您深入研究路由源代码,如果您确定在执行期间必须执行此操作,则可能会找到保护路由表“重建”的方法。
但是,我强烈建议你改用“网站”控制器的想法。请考虑以下事项:路由用于解析传入的URI 和以生成URI。如果您的应用程序中有一个案例使用ActionLink
而不是RouteLink
,那么请考虑用户添加的路由可能会破坏整个站点。意味着用户无法解决他们的错误,即使他们意识到他们已经造成了错误。
答案 1 :(得分:7)
我的想法是在“页面”表格中创建一个名为“Slug”的字段。当您的用户创建新页面时,他们必须填写“Slug”字段并输入他们希望在网址中看到的内容(例如:页面需要 - “关于”,slug - “about”|页面需要 - “请参阅我们的赞助商“,slug - ”看到我们的赞助商“|等等。如果需要,您可以使用一些javascript自动执行此过程。
创建如此的路线:
routes.MapRoute(
null,
{slug},
new { controller = "Page", action = "ChoosePage" });
创建一个像这样的动作方法:
[AcceptVerbs(HttpVerbs.Get)]
public ViewResult ChoosePage(string slug)
{
//Logic to display page
}
基本上它会像你的想法一样将页面ID放在url中,但它会更清晰,它会使用'slug'来进行数据库查找而不是页面ID。
答案 2 :(得分:3)
我想到的最好的想法是使用“最后一种情况”的想法。
基本上你有这种情况。
1-正常路由(例如:controller / action / id route)。
2-您可以设置的任何特殊路线/区域(例如:admin)
3-写一条catchall路线。此路由将在db中搜索路由命名的页面。如果此路由不存在,则会抛出404页面未找到错误。
答案 3 :(得分:2)
这是最终代码的样子,感谢所有帮助过的人!
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Home",
"",
new { controller = "Home", action = "Index" }
);
routes.MapRoute(
"Account",
"Account/{action}",
new { controller = "Account", Action = "Index" }
);
routes.MapRoute(
"Page",
"{*slug}",
new { controller = "Page", action = "ChoosePage" }
);
}
答案 4 :(得分:2)
这可以通过以下方式完成:
1.在RouteTable
中插入该页面的新路线RouteTable.Routes.Insert(1,new Route("Test", new RouteValueDictionary(new { controller = "Page", action = "ChoosePage" ,pagename="Test" }), new MvcRouteHandler()));
public ActionResult ChoosePage(string pagename)
{
return View(pagename);
}
这将解决在运行时新创建的页面的路由,但这需要保存在数据库中。