我在剃刀页面中有以下代码:
http://localhost/category/6/category-name
放置此代码的网页网址的格式为6
,其中InformationController
是类别的ID
在[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.Action(...)
的网址,因为我在页面中的article/6/article-slug
始终尝试使用ID进行控制器操作,即使ID未以匿名类型提供也是如此。
链接采用article/article-slug
的形式,而不是我希望它们为var a = 1/2, b = 1/3, c = 1/12, d = 1/12, e = 0;
,而不会在控制器中删除带有id的操作。
我注意到 6 来自该类别的ID。此外,如果我使用Id删除控制器操作,我将获得正确的URL格式。
答案 0 :(得分:0)
在解析您要关联的操作时,IUrlHelper
实例正在使用当前路由(http://localhost/category/6/category-name)中的当前值id
,其值为{{ 1}},正如你在OP中所述。由于存在同时采用{{1}}和6
(您明确提供)的ArticleDetails
操作,因此会选择同时采用这两个参数的id
操作。< / p>
为了解决这个问题,有几种选择。第一个选项是在到达http://localhost/category/6/category-name时调用的操作中清除slug
值。为此,您可以在所述操作中使用以下代码:
ArticleDetails
我不喜欢这样做,但确实有效。 IMO,更好的方法是简单地为RouteData
参数使用不同的名称:例如各个控制器中的RouteData.Values.Remove("id");
和id
。这既修复了您的问题,又使代码在相应的操作中更具可读性。您的categoryId
操作只会更改为:
articleId
答案 1 :(得分:0)
尝试执行此类重载时,路由可能很糟糕。您最好的选择是使用命名路线:
workspace_status_command
然后,在您看来:
[HttpGet("article/{id}/{slug}", Name = "ArticleDetailsIdSlug")]
public IActionResult ArticleDetails(int id, string slug)
[HttpGet("article/{slug}", Name = "ArticleDetailsSlug")]
public IActionResult ArticleDetails(string slug)
现在,路由框架不必试图找出你真正想要的路线(并且猜测不正确),因为你已经准确地告诉它使用哪条路线。