代码之家  ›  专栏  ›  技术社区  ›  Ian Oxley

具有多个路由值的ASP.NET MVC URL路由

  •  50
  • Ian Oxley  · 技术社区  · 15 年前

    当我有一个采用多个参数的路由时,html.actionLink出现问题。例如,假设在my global.asax文件中定义了以下路由:

    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}.mvc/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );
    
    routes.MapRoute(
        "Tagging",
        "{controller}.mvc/{action}/{tags}",
        new { controller = "Products", action = "Index", tags = "" }
    );
    
    routes.MapRoute(
        "SlugsAfterId",
        "{controller}.mvc/{action}/{id}/{slug}",
        new { controller = "Products", action = "Browse", id = "", slug = "" }
    );
    

    前两条路线毫无问题地工作,但当我尝试创建到第三条路线的操作链接时,使用:

    <%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %>
    

    最后我得到了一个类似 [网站根目录]/详细信息/1?蛞蝓蛞蝓 但是我希望URL更像 [网站根目录]/details/1/url slug

    有人知道我哪里出错了吗?

    3 回复  |  直到 15 年前
        1
  •  60
  •   Garry Shutler    15 年前

    它使用的是完全满意的第一条路线。试着把你的 SlugsAfterId 上面的路线 Default 一个。

    基本上是这样的:“检查默认值。采取行动了吗?对。拿到身份证了吗?对。使用这一个并在querystring中丢弃任何其他参数。”

    作为旁注,这样做会使你 违约 路由冗余,因为您为 slug 参数。

        2
  •  32
  •   Brettski    14 年前

    加里(上图)是对的。您可以使用haack先生的路由调试器进行MVC。它可以帮助解决路由问题,方法是显示哪些路由被击中以及何时击中。

    这里是 Blog Post . 这里是 Zip File .

        3
  •  8
  •   Chris Pietschmann    15 年前

    您可以向包含“id”的路由添加一个约束,因为它可能只接受一个数字。这样,第一个路由只在“id”为数字时匹配,然后它将为所有其他值生成第二个路由。然后把一个包括_弹_的东西放在上面,一切都应该正常工作。

    routes.MapRoute(
        "SlugsAfterId",
        "{controller}.mvc/{action}/{id}/{slug}",
        new { controller = "Products", action = "Browse", id = "", slug = "" },
        new { id = @"\d+" }
    );
    
    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}.mvc/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" },  // Parameter defaults
        new { id = @"\d+" }
    );
    
    routes.MapRoute(
        "Tagging",
        "{controller}.mvc/{action}/{tags}",
        new { controller = "Products", action = "Index", tags = "" }
    );