ASP.NET 核心属性路由 - 区域设置前缀



我有以下控制器:

[Route("blog")]
[Route("{locale:regex(^(de|es|fr)$)}/blog", Order = -1)]
public class BlogController : Controller {
[HttpGet("{id:int}.htm")]
[HttpGet("{slug}/{id:int}.htm")]
public IActionResult Details(string? slug, int id) {
return View();
}
}

现在,如果我尝试生成以下URL:

  • @Url.Action("Details", "Blog", new { id = 1 }(
  • @Url.操作("详细信息", "博客", 新 { slug = "cat-1", id = 1 }(
  • @Url.操作("详细信息", "博客", 新 { id = 1, locale = "fr" }(
  • @Url.操作("详细信息", "博客", new { slug = "cat-1", id = 1, locale = "fr" }(

我期望以下内容:

  • /blog/1.htm
  • /blog/cat-1/1.htm
  • /fr/blog/1.htm
  • /fr/blog/cat-1/1.htm

但是,这将返回:

  • /blog/1.htm
  • /
  • blog/1.htm?slug=cat-1
  • /fr/blog/1.htm
  • /
  • fr/blog/1.htm?slug=cat-1

我已经尝试更改所有路由属性的顺序,但我无法让它返回所需的结果,我将不胜感激任何帮助。

以下示例给出了预期的结果:

public class BlogController : Controller
{
[Route("{locale:regex(^(de|es|fr)$)}/blog/{slug}/{id:int}.htm")]
[Route("{locale:regex(^(de|es|fr)$)}/blog/{id:int}.htm", Order = 1)]
[Route("blog/{slug}/{id:int}.htm", Order = 2)]
[Route("blog/{id:int}.htm", Order = 3)]
public IActionResult Details(string? slug, int id)
{
return View();
}
}

此方法对更具体的路由使用较早的Order,以便首先检查这些路由。明显的缺点是冗长,但这是一个基于所述要求的工作解决方案。

如果您不介意更改slug的顺序,则可以像下面这样更改控制器:

[Route("blog")]
[Route("{locale:regex(^(de|es|fr)$)}/blog", Order = -1)]
public class BlogController : Controller
{
[HttpGet("{id:int}.htm/{slug?}")]
public IActionResult Details(string? slug, int id)
{
return View();
}
}

生成以下网址:

@Url.Action("Details", "Blog", new { id = 1 })
@Url.Action("Details", "Blog", new { slug = "cat-1", id = 1 })
@Url.Action("Details", "Blog", new { id = 1, locale = "fr" })
@Url.Action("Details", "Blog", new { slug = "cat-1", id = 1, locale = "fr" })

结果:

/blog/1.htm
/blog/1.htm/cat-1
/fr/blog/1.htm
/fr/blog/1.htm/cat-1

相关内容

  • 没有找到相关文章

最新更新