ASP.NET MVC:路由问题

时间:2013-01-12 11:54:39

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

所以我有这个控制器动作:

public ActionResult Categories(int typecode)
{
  // code removed
}

这条路线:

routes.MapRoute(null,
  "{controller}/{action}/{typecode}",
  new { controller = "Search", action = "Categories", }
);

和此链接调用路线:

@Html.ActionLink("Ga", "Categories", "Search", new { typecode = 16860 }, null)

如果我使用此功能,我的网址为:http://localhost:50033/Search/Categories?typecode=16860 但是如果我将typecode的所有出现更改为id,那么它就可以了,我会收到此网址:http://localhost:50033/Search/Categories/16860

因此,对于typecode,我的路由不起作用,并且使用id。我究竟做错了什么?谢谢!

修改

我认为我不够清楚,但在我的Global.asax.cs文件中我有这个:

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute("TypeCode",
    "Search/Categories/{typecode}",
    new { controller = "Search", action = "Categories" }
  );
}

所以这只是一条路线,而不是SearchController我有Categories动作:

public ActionResult Categories(int typecode)
{
  // Irrelevant code removed
}

因此参数与route参数完全相同,那么我有这个链接:

@Html.ActionLink("Ga", "Categories", "Search", new { typecode = 16860 }, null)

同样使用完全路由参数,但仍然生成的链接是:http://localhost:50033/Search/Categories?typecode=16860所以这不是我想要的。

现在,当我替换所有类型代码出现时,如下所示:

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute("TypeCode",
    "Search/Categories/{id}",
    new { controller = "Search", action = "Categories" }
  );
}

public ActionResult Categories(int id)
{
  // irrelevant code removed
}

@Html.ActionLink("Ga", "Categories", "Search", new { id = 16860 }, null)

有效!所以我替换一切,没有更多路线,我只是用typecode替换了3 id次出现。

这是为什么?有人可以帮我这个吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

  

因此,对于typecode,我的路由不起作用,并且使用id。我做错了什么?

问题是你无疑仍然在你的自定义路线之前映射的默认路线,即

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

这意味着匹配类似于“controller / action / id”的url的任何内容都将由默认路由解析,而不是自定义路由。此路由无法将typecode识别为预期参数这一事实意味着它被视为查询字符串参数(因此?typecode=)。

如果您希望选择typecode更具体地说明要将其映射到哪个控制器,并将此路线放在之前,即默认值。

routes.MapRoute(
    "CategoryItem",
    "{controller}/Categories/{typecode}",
    new { controller = "Search", action = "Categories", typecode = UrlParameter.Optional }
);

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

这会限制任何以controller/Categories/开头只接受typecode而不是id的网址 - 这会导致您的网址形成为Search/Categories/12345。如果您真的想要(可以在路由中将{controller}替换为Search),您可以通过控制器对此进行进一步约束。

但是,考虑到您实际上并未在URL中显示typecode,我认为没有任何真正的好处。我可以理解你是否希望将网址显示为Search/Categories?typecode=12345,因为它可能比id更具描述性。就个人而言,我会保留您的默认路线,并将您的操作链接更改为:

@Html.ActionLink("Ga", "Categories", "Search", new { id = 16860 }, null)

它会给你相同的结果。

<强>更新

根据您的更新,我唯一能想到的是您没有在路线中指定默认值,所以可能没有正确选择参数,请尝试:

routes.MapRoute("TypeCode",
    "Search/Categories/{typecode}",
    new { controller = "Search", action = "Categories", typecode = "" }
);

答案 1 :(得分:1)

问题解决了。我会解释有同样问题的人出了什么问题。

我在这个项目中使用ASP.NET MVC 4,之前我使用MVC 3创建了一些网上商店。我一直在做的是将路由放在Global.asax.cs文件中。现在,当我开始我的项目时,没有RegisterRoutes()方法,所以我创建了一个并将我的路线放入其中。刚才我读了this帖子,它说MVC 4在App_Data/RouteConfig.cs中注册了它的路由我检查了那个文件,看到RegisterRoutes()方法有一条路由,默认路由为可选参数id

这就是为什么它仅使用id作为参数,MVC 4甚至没有在Global.asax.cs中查看我的路线,只是选择App_Data/RouteConfig.cs的唯一路线

我确实将我的路线放在App_Data/RouteConfig.cs文件中,但它确实有效!再次学到了东西,我很高兴它终于有效了。另外,我要感谢@James帮助我。