C# 无法生成正确的链接

C# 无法生成正确的链接,c#,razor,asp.net-core,C#,Razor,Asp.net Core,我在razor页面中有以下代码: @Url.Action("ArticleDetails", "Information", new { slug = article.Slug }) 放置此代码的页面url的形式为http://localhost/category/6/category-name其中6是类别的ID 在InformationController中,我有以下操作: [HttpGet("article/{id}/{slug}")] public IActionResult Articl

我在razor页面中有以下代码:

@Url.Action("ArticleDetails", "Information", new { slug = article.Slug })
放置此代码的页面url的形式为
http://localhost/category/6/category-name
其中
6
是类别的ID

InformationController
中,我有以下操作:

[HttpGet("article/{id}/{slug}")]
public IActionResult ArticleDetails(int id, string slug)
{
    // some code ...

    return View(data);
}

[HttpGet("article/{slug}")]
public IActionResult ArticleDetails(string slug)
{
    // some code ...

    return View(data);
}
我如何访问表单
article/article slug
的URL,因为我在页面中的
@URL.Action(…)
总是尝试访问id为的控制器操作,即使id不是作为匿名类型提供的


链接采用
article/6/article slug
的形式,我希望它们是
article/article slug
,而不删除控制器中id为的操作


我注意到6来自类别的id。另外,如果我删除Id为的控制器操作,我将获得正确的URL格式。

解析您链接到的操作时,
IUrlHelper
实例正在当前路由()中使用当前值
Id
,该值为
6
,正如您在OP中所述。由于存在一个
ArticleDetails
操作,该操作同时使用
id
slug
(您明确提供),因此选择了同时使用这两个参数的
ArticleDetails
操作

为了解决这个问题,有两种选择。第一个选项是在到达时调用的操作中使用
routedData
值后,清除该值。为此,您可以在所述操作中使用以下代码:

RouteData.Values.Remove("id");
我不喜欢这样做,但它确实有效。在我看来,更好的方法是简单地为
id
参数使用不同的名称:例如,在各自的控制器中使用
categoryId
articleId
。这既解决了您的问题,又使代码在相应的操作中更具可读性。您的
ArticleDetails
操作只需更改为:

[HttpGet("article/{articleId}/{slug}")]
public IActionResult ArticleDetails(int articleId, string slug)
{
    // some code ...

    return View(data);
}

当尝试这样做重载时,路由可能会很挑剔。您的最佳选择是使用命名路由:

[HttpGet("article/{id}/{slug}", Name = "ArticleDetailsIdSlug")]
public IActionResult ArticleDetails(int id, string slug)

[HttpGet("article/{slug}", Name = "ArticleDetailsSlug")]
public IActionResult ArticleDetails(string slug)
那么,在你看来:

@Url.RouteUrl("ArticleDetailsSlug", new { slug = article.Slug })

现在,路由框架不必试图找出您真正想要的路由(显然猜错了),因为您已经告诉它要使用哪条路由。

article/6/article slug
将调用
articledtails(int-id,string-slug)
<代码>文章/文章段塞将调用
文章详细信息(字符串段塞)
。您能详细说明一下您希望实现的目标吗?@Win我无法生成
文章/文章slug
形式的链接。我知道你在说什么。链接生成为
article/id/article slug
@Url.Action(“ArticleDetails”,“article”,new{slug=“sample”})
生成
http://localhost:64522/article/sample
@Url.Action(“ArticleDetails”,“Article”,new{id=6,slug=“sample”})
生成
http://localhost:64522/article/6/sample
。我遗漏了什么吗?谢谢你的回答。这正是我应该知道的。使用
RouteData.Values.Remove(“id”)有什么缺点?主要的缺点是明确知道有一个
id
值具体存在于
RouteData
中。这意味着,例如,如果要将名称
id
更改为其他名称,则还必须更改此行以匹配新名称。我不认为像
id
这样的东西有什么大不了的,但这是需要注意的。