剃刀不良的ASP路由链接生成

时间:2019-03-06 16:21:10

标签: c# asp.net-mvc razor asp.net-core

我试图建立一个分页系统。但是我的剃刀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生成所需的网址?

1 个答案:

答案 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",它将被忽略并且输出是相同的。事实证明,生成网址排除了具有特定名称的参数,例如pageactioncontrollerarea很好,可能还有更多的关键字)。因此,我的解决方案只是专门针对page参数名称的解决方法。如果尝试添加actioncontroller参数,我的解决方案将只生成存根值/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)