动态URL路由ASP MVC

时间:2009-12-28 15:06:18

标签: asp.net-mvc url-rewriting url-routing

我试图创建一个非常简单的应用程序,让我的客户端创建自己的页面。 困难的部分是让他们创建自己的URL。

客户需要填写:

  • 页面名称(例如关于我们)。
  • 页面描述(例如,我们是一家大公司)。
  • 页面URL相对(例如/关于)

当客户输入此信息并保存时,应将其保存在数据库中。

我可以轻松创建名为“Page”的控制器,其值为“ID”,当用户输入“www.someurl.com/Page/1”时,弹出新创建的页面。

但我真正想要的是让用户写“www.someurl.com/About”,然后弹出页面。

如何使用ASP MVC使用某种动态重写/路由代码来完成。

5 个答案:

答案 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);
}

这将解决在运行时新创建的页面的路由,但这需要保存在数据库中。

  1. 编写代码以从数据库检索所有路由并在Global.asax.cs文件中写入Application_Start()