You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET路由为何自动带入ID?分类菜单路由异常咨询

ASP.NET Core菜单路由参数自动复用问题

问题描述

我正在制作带有分类的菜单,第一个菜单项为「所有分类」,所有菜单项均调用Auction控制器的Index方法,但第一个菜单项无需传递id参数。不解的是,不设置asp-route-id时,链接会自动带上最后点击的菜单项的id,必须将其设为null才行。想知道原因和其他解决办法。

原因说明

这是ASP.NET Core路由系统的默认行为:路由值提供程序会自动复用当前请求上下文里已存在的路由参数。当生成链接时没有显式指定某个路由参数,框架会从当前请求的路由数据、查询字符串等位置提取对应参数值并自动填充到新链接中,所以就出现了自动带上之前分类id的情况。

解决方法

方法1:显式指定asp-route-id=null(当前可行方案)

在「所有分类」的链接中明确设置asp-route-id=null,强制框架不复用现有id参数,生成的URL就不会包含id。

可行代码示例:

<div class="menu">
    @if (Model.CurrentCategory == null)
    {
        <a class="d-block active" asp-controller="Auction" asp-action="Index" asp-route-id=null><span></span>All categories</a>
    }
    else
    {
        <a class="d-block" asp-controller="Auction" asp-action="Index" asp-route-id=null><span></span>All categories</a>
    }
    @foreach (var category in Model.Categories)
    {
        @if (@category.Id_category == Model.CurrentCategory)
        {
            <a class="d-block active" asp-controller="Auction" asp-action="Index" asp-route-id="@category.Id_category"><span></span>@category.Name</a>
        }
        else
        {
            <a class="d-block" asp-controller="Auction" asp-action="Index" asp-route-id="@category.Id_category"><span></span>@category.Name</a>
        }
    }
</div>

方法2:用asp-all-route-data清空路由参数

创建空的路由数据字典,覆盖默认的参数复用逻辑,确保新链接不携带任何额外路由参数:

<div class="menu">
    <a class="d-block @(Model.CurrentCategory == null ? "active" : "")" 
       asp-controller="Auction" 
       asp-action="Index" 
       asp-all-route-data="@(new Dictionary<string, string>())">
        <span></span>All categories
    </a>
    @foreach (var category in Model.Categories)
    {
        @if (@category.Id_category == Model.CurrentCategory)
        {
            <a class="d-block active" asp-controller="Auction" asp-action="Index" asp-route-id="@category.Id_category"><span></span>@category.Name</a>
        }
        else
        {
            <a class="d-block" asp-controller="Auction" asp-action="Index" asp-route-id="@category.Id_category"><span></span>@category.Name</a>
        }
    }
</div>

方法3:直接指定静态URL

如果路由规则固定,也可以直接写死URL,避免框架自动填充参数:

<div class="menu">
    <a class="d-block @(Model.CurrentCategory == null ? "active" : "")" href="/Auction/Index">
        <span></span>All categories
    </a>
    @foreach (var category in Model.Categories)
    {
        @if (@category.Id_category == Model.CurrentCategory)
        {
            <a class="d-block active" asp-controller="Auction" asp-action="Index" asp-route-id="@category.Id_category"><span></span>@category.Name</a>
        }
        else
        {
            <a class="d-block" asp-controller="Auction" asp-action="Index" asp-route-id="@category.Id_category"><span></span>@category.Name</a>
        }
    }
</div>

这种方式灵活性较差,路由配置变更时需要手动修改URL。

不可行代码示例(自动复用id)

<div class="menu">
    @if (Model.CurrentCategory == null)
    {
        <a class="d-block active" asp-controller="Auction" asp-action="Index"><span></span>All categories</a>
    }
    else
    {
        <a class="d-block" asp-controller="Auction" asp-action="Index" ><span></span>All categories</a>
    }
    @foreach (var category in Model.Categories)
    {
        @if (@category.Id_category == Model.CurrentCategory)
        {
            <a class="d-block active" asp-controller="Auction" asp-action="Index" asp-route-id="@category.Id_category"><span></span>@category.Name</a>
        }
        else
        {
            <a class="d-block" asp-controller="Auction" asp-action="Index" asp-route-id="@category.Id_category"><span></span>@category.Name</a>
        }
    }
</div>

内容的提问来源于stack exchange,提问作者Peter Chovanec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:40:38