我试图建立一个分页系统。但是我的剃刀asp-route代码有问题。
这是控制器:
[Route("blog")]
public class BlogController : BaseController
{
[Route("{categorySlug}")]
public async Task<IActionResult> Category([FromRoute] string categorySlug, [FromQuery] int page)
{
return View();
}
}
这是用于生成url的razor标签帮助程序:
<a class="link" asp-action="Category" asp-controller="Blog"
asp-route-categorySlug="some-slug"
asp-route-page="1">1</a>
我希望生成的href为:
/blog/some-slug?page=1
但是我有以下网址:
/Blog/Category?categorySlug=some-slug&page=1
是否可以使用asp-route
生成所需的网址?
答案 0 :(得分:1)
在app.UseMvc
中使用Startup.cs
配置路由模板
app.UseMvc(routes =>
{
routes.MapRoute(
name: "BlogRoute",
template: "blog/{categorySlug}");
//.. other routes
});
更新您的链接以使用此路由
<a class="link" asp-route="BlogRoute"
asp-route-categorySlug="some-slug"
asp-route-page="1">1</a>
使用动作和控制器名称进行了一些修改的解决方案
路由配置
routes.MapRoute(
name: "BlogRoute",
template: "blog/{categorySlug}",
defaults: new { controller = "Blog", action = "Category" });
链接
<a class="link" asp-action="Category" asp-controller="Blog"
asp-route-categorySlug="some-slug"
asp-route-page="1">1</a>
尝试失败
有人可能想知道我们是否使用属性路由并强制标签助手使用此路由(通过设置asp-route
)
[Route("blog")]
public class BlogController : Controller
{
[Route("{categorySlug}", Name = "BlogRoute")]
public async Task<IActionResult> Category([FromRoute] string categorySlug, [FromQuery] int page) {
//..
}
和链接代码
<a class="link" asp-route="BlogRoute"
asp-route-categorySlug="some-slug"
asp-route-page="1">1</a>
在这种情况下,page
的值将被完全忽略,而得到的URL为/blog/some-slug
注意
各种测试表明,您问题中的代码实际上可以正常工作,您无需在app.UseMvc
中添加路由。例如以下链接
<a class="link" asp-route="BlogRoute"
asp-route-value="val1"
asp-route-data="info"
asp-route-categorySlug="some-slug">1</a>
生成此网址
/blog/some-slug?value=val1&data=info
但是,如果您添加asp-route-page="1"
,它将被忽略并且输出是相同的。事实证明,生成网址排除了具有特定名称的参数,例如page
,action
和controller
(area
很好,可能还有更多的关键字)。因此,我的解决方案只是专门针对page
参数名称的解决方法。如果尝试添加action
或controller
参数,我的解决方案将只生成存根值/path
。
因此,这意味着您可以像这样使用page
以外的其他名称
<a class="link" asp-route="BlogRoute"
asp-route-categorySlug="some-slug"
asp-route-pageNum="1">1</a>
并将page
参数绑定到pageNum
名称
[Route("{categorySlug}", Name = "BlogRoute")]
public async Task<IActionResult> Category([FromRoute] string categorySlug, [FromQuery(Name = "pageNum")] int page)