代码之家  ›  专栏  ›  技术社区  ›  Martin at Mennt

动态url路由ASP MVC

  •  3
  • Martin at Mennt  · 技术社区  · 16 年前

    我试图制作一个非常简单的应用程序,让我的客户创建自己的页面。

    客户需要填写:

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

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

    我可以很容易地创建一个名为“Page”的控制器,它接受一个值“ID”,当用户输入“www.someurl.com/Page/1”时,新创建的页面会弹出。

    如何使用ASP MVC使用某种动态重写/路由代码来实现这一点。

    5 回复  |  直到 16 年前
        1
  •  7
  •   DM.    16 年前

    创建一条如下所示的路线:

    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
  •  7
  •   Craig Stuntz    16 年前

    正如这个网站上关于路由的问题的数量所表明的那样,即使对于程序员来说,正确处理多条可能重叠的路由也是很棘手的。将这种影响广泛的功能交给最终用户是可怕的。

    要回答您的问题,在应用程序启动时从数据库中读取“自定义”路由并像往常一样映射它们是相当简单的。您通常不会在应用程序执行期间执行此操作,因为路由列表将在多个线程之间共享。如果深入研究路由源代码,您可能会找到一种方法来保护路由表的“重建”,前提是您确定必须在执行期间进行重建。

    然而,我强烈建议你改为使用你的“站点”控制器。考虑以下事项:路由用于解析传入URI 用于生成URI。如果应用程序中有一个案例 ActionLink 而不是 RouteLink

        3
  •  3
  •   Erick    16 年前

    我心目中最好的想法是使用“最后一个案例场景”的想法。

    1-正常路由(例如:控制器/操作/id路由)。
    2-您可以设置的任何特殊路线/区域(例如:管理员)
    3-编写一个catchall路由。此路由将在db中搜索由路由命名的页面。如果此路由不存在,它将抛出404页未找到错误。

        4
  •  2
  •   Martin at Mennt    16 年前

    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" }
            );
    
        }
    
        5
  •  2
  •   Dan Beaulieu    11 年前

    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()