我是通过詹姆斯的评论回复你的。一个问题可能是您的路线如下所示:
routes.MapRoute(
"articlename", // Route name
"{articleID}", // URL with parameters
new { action="DetailsByName",controller="Article" }, // parameter defaults
new[] { "bssnew.Controllers" } // controller namespaces
);
生成路由(不使用命名路由)时,您的链接应如下所示:http://www.example.com/Article/DetailsByName?articleId=123
其中 123 是您的文章 ID。
像这样生成上述链接的条件是将其放在“默认”路由之前。另外,检查命名空间注册是否给您带来了问题。如果不需要,请先尝试删除命名空间。
这是我根据您的问题创建的快速示例。结果是,即使将命名路由置于默认路由之下,我也设法生成了正确的路由。以下是 的内容RouteConfig.cs
:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "CalculationRoute", // Note that it is below the default route
url: "{controller}/{action}/{x}/{y}", // using both controller and action
defaults: new { controller = "Home", action = "Calculate"}
);
}
}
在我的 HomeController 中,我添加了以下操作:
public ActionResult Calculate(int x, int y)
{
return Content(String.Format("x:{0} + y:{1} = {2}", x, y, (x + y)));
}
现在,这里是索引视图的内容
<table>
<thead>
<tr>
<th>Method used</th>
<th>Result</th>
</tr>
</thead>
<tbody>
<tr>
<td>@@Html.ActionLink("Sample link", "Calculate", "Home", new {x = 1, y = 2})</td>
<td>@Html.ActionLink("Sample link", "Calculate", "Home", new {x = 1, y = 2})</td>
</tr>
<tr>
<td>@@Html.RouteLink("Sample link", new {controller = "Home", action = "Calculate", x = 1, y = 2}, null)</td>
<td>@Html.RouteLink("Sample link", new {controller = "Home", action = "Calculate", x = 1, y = 2}, null)</td>
</tr>
<tr>
<td>@@Html.RouteLink("Sample link", "CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
<td>@Html.RouteLink("Sample link", "CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
</tr>
<tr>
<td>@@Url.RouteUrl(new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
<td>@Url.RouteUrl(new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
</tr>
<tr>
<td>@@Url.RouteUrl("CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
<td>@Url.RouteUrl("CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
</tr>
</tbody>
</table>
上面的代码生成了预期的内容。例如(顺便说一句,我正在使用一些虚拟链接,因为 SO 不允许使用 localhost):
如果我从计算路由中删除 {controller}/{action} ,它将生成链接(带有命名路由)为http://www.example.com/1/2。
总而言之,如果您打算使用命名路由来生成对 SEO 友好的 URL,请使用 {controller}/{action}/{articleId} 配置您的路由。如果它不是太重要,则使用 RouteLink 生成您的路线,但不要指定路线名称。
更新:如果你不打算在你的路由中使用 {controller}/{action} 并且只使用 {articleId},你应该将你的路由放在 Default 之前,并且在生成链接时不要使用命名路由。在我上面的例子中,它看起来像:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "", // Note that it is below the default route
url: "{x}/{y}", // using both controller and action
defaults: new { controller = "Home", action = "Calculate"}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
现在,当您使用生成链接时,@Html.RouteLink
您可以这样做:
@Html.RouteLink("My Link", new {controller = "Home", action = "Calculate", x = 1, y = 2 })
这将产生类似的东西:
http://www.VirtuoZ.com/Home/Calculate?x=1&y=2
更新 2:关于您对其他路线的请求,您始终可以依靠默认路线来生成信息,但是,您不能像评论中所说的那样生成路线:
http://www.example.com/abc文章和http://www.example.com/def产品
问题是路由是相同的,路由系统将选择可以满足您请求的第一条路由。可能会发生两个请求都由相同的路由提供服务。您需要区分这两条路线。因此,对于您的文章,请使用您定义的新路由,对于需要一个参数的其他事情,您将使用默认路由。