ASP.NET 核心属性路由 - 语言环境前缀
ASP.NET Core Attribute Routing - Locale Prefix
我有以下控制器:
[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.Action("Details",
"Blog", 新 { 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/cat-1/1.htm
- /fr/blog/1.htm
- /fr/blog/cat-1/1.htm
但是这个 returns:
- /blog/1.htm
- /blog/1.htm?slug=cat-1
- /fr/blog/1.htm
- /fr/blog/1.htm?slug=cat-1
我已尝试更改所有路由属性的顺序,但无法达到 return 所需的结果,非常感谢任何帮助。
如果你不介意改变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:
@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
以下示例给出了预期的结果:
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
,以便首先检查这些路线。明显的缺点是冗长,但它是基于所描述要求的有效解决方案。
我有以下控制器:
[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.Action("Details", "Blog", 新 { 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/cat-1/1.htm
- /fr/blog/1.htm
- /fr/blog/cat-1/1.htm
但是这个 returns:
- /blog/1.htm
- /blog/1.htm?slug=cat-1
- /fr/blog/1.htm
- /fr/blog/1.htm?slug=cat-1
我已尝试更改所有路由属性的顺序,但无法达到 return 所需的结果,非常感谢任何帮助。
如果你不介意改变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:
@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
以下示例给出了预期的结果:
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
,以便首先检查这些路线。明显的缺点是冗长,但它是基于所描述要求的有效解决方案。