所以我有这个控制器动作:
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
次出现。
这是为什么?有人可以帮我这个吗?提前谢谢!
答案 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帮助我。