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
相关产品推荐
相关产品推荐

