在mvc中传递控制器名称后面的查询字符串

时间:2015-08-19 13:30:18

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

我正在尝试在控制器名称

之后传递mvc中的参数

我添加了

routes.MapRoute(
     name: "Product",
      url: "Product/{*id}",
     defaults: new { controller = "Product", action = "Index", id = UrlParameter.Optional }
            );

这不起作用

我也试过url: "Product/{id}",

但是,如果我删除它上面的行(这篇文章中的下面的行),它正在工作

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

2 个答案:

答案 0 :(得分:3)

您注册路线的顺序很重要。使用匹配请求的第一个路由。如果我理解正确,你最初有:

routes.MapRoute(
    name: "Default",
...

routes.MapRoute(
    name: "Product",

默认路由非常通用,因为它首先被注册,所以您的所有请求都会被选中,从而有效地隐藏了产品路径。

注册路线的正确方法是从大多数特定路线开始,并在最后注册最通用的路线。所以在你的情况下应该颠倒过来:

routes.MapRoute(
    name: "Product",
...
routes.MapRoute(
    name: "Default",

答案 1 :(得分:1)

在这种情况下,制作" id"更有意义。参数a 必需 参数,而不是可选参数。你可能也不希望它成为一个slu(({*id})。这将有助于确保您的Product路由与请求不匹配,路由框架将尝试列表中的下一个路由(在本例中为Default)。

要确保在没有匹配时会错过,您还可以添加路线约束以确保" id"是数字,就像route constraint example on MSDN

routes.MapRoute(
    name: "Product",
    url: "Product/{id}",

    // id has no default value, which makes it required in order to match
    defaults: new { controller = "Product", action = "Index" },

    // (optional) adding a constraint will make sure the id is only digits
    constraints: new { id = @"\d+" }
);

// You will only end up here if the above route does not match, 
// so it is important that you ensure that it CAN miss.
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);