无法生成正确的链接

时间:2018-06-01 13:44:55

标签: c# razor asp.net-core

我在剃刀页面中有以下代码:

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格式。

2 个答案:

答案 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)

现在,路由框架不必试图找出你真正想要的路线(并且猜测不正确),因为你已经准确地告诉它使用哪条路线。