0

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

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)

如果我使用它,我的 URL 是:http://localhost:50033/Search/Categories?typecode=16860 但是如果我将所有出现的typecodeto更改为id,它可以工作并且我得到这个 URL: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
}

所以参数和路由参数一模一样,那么我有这个链接:

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

有用!所以我替换了所有东西,没有更多的路线,我只是typecodeid.

为什么是这样?任何人都可以帮我解决这个问题吗?提前致谢!

4

2 回答 2

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/时只接受 atypecode而不是 an 的url id- 这应该导致您的 URL 形成为Search/Categories/12345. 如果您真的想要,您可以通过控制器进一步限制这一点(只需在路线中替换{controller}Search

但是,考虑到您实际上并没有在任何地方显示在 URL 中,我认为这样做没有任何真正的好处。typecode如果您希望显示 url,我可以理解,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 = "" }
);
于 2013-01-12T12:09:13.783 回答
1

问题已经解决了。我将为遇到相同问题的任何人解释出了什么问题。

我在这个项目中使用 ASP.NET MVC 4,之前我用 MVC 3 创建了一些网上商店。我一直在做的是将路由放入Global.asax.cs文件中。现在,当我开始我的项目时,没有RegisterRoutes()方法,所以我创建了一个并将我的路线放入其中。刚才我读了这篇文章,它说 MVC 4 在App_Data/RouteConfig.cs我签出该文件中注册了它的路由,并看到了RegisterRoutes()带有一条路由的方法,默认的带有 as optional parameter id

所以这就是为什么它只使用id作为参数,MVC 4 甚至没有查看我的路线Global.asax.cs,而只是从App_Data/RouteConfig.cs.

我确实将我的路线放在App_Data/RouteConfig.cs文件中并且它有效!又学到了一些东西,我很高兴它终于奏效了。我还要感谢@James 对我的帮助。

于 2013-01-12T15:11:41.710 回答