如果从另一个具有参数的链接访问页面,则不带参数的 Url.Action 会追加一个

问题描述 投票:0回答:1

我有一个菜单,我可以从中设置一个不带参数的页面链接:

<a href='@Url.Action("DaysOffSchedule", "DaysOff")'>My schedule</a>

在另一页上,我有一个项目列表,其中包含提供 ID 的链接:

<a href='@Url.Action("DaysOffSchedule", "DaysOff", new { personnelId = 2 })'>Smith's schedule</a>
<a href='@Url.Action("DaysOffSchedule", "DaysOff", new { personnelId = 7 })'>Doe's schedule</a>

一旦我访问史密斯的日程并回发以保存他们的数据,我的菜单链接就会自动附加 2 并变为

<a href="/DaysOff/DaysOffSchedule/2">My schedule</a>

这是我的路线图:

app.MapControllerRoute(
    name: "days-off-schedule",
    pattern: $"DaysOff/DaysOffSchedule/{{personnelId}}", // with or without ? doesn't affect the behaviour
    defaults: new {controller = "DaysOff", action = "DaysOffSchedule" });
app.MapControllerRoute(
    name: "default",
    pattern: $"{{controller=Home}}/{{action=Login}}/{{id?}}");

这是示例控制器:

public class DaysOffController : Controller
{
    public IActionResult DaysOffSchedule(int? personnelId)
    {
        return View(nameof(DaysOffSchedule), new SingleStringModel($"Hello {personnelId}"));
    }

    [HttpPost]
    public IActionResult DaysOffSchedule(SingleStringModel model)
    {
        ModelState.Clear();
        model.Text = $"{model.Text}. OK";
        return View(nameof(DaysOffSchedule), model);
    }
}

为什么 asp 将最后使用的参数附加到链接,而我没有提供任何参数?问题显然出在“偏离计划的日子”路线上,但我做错了什么?

c# asp.net-mvc asp.net-core asp.net-mvc-routing
1个回答
0
投票

为什么 asp 将最后使用的参数附加到链接,而我没有 提供任何吗?问题显然出在“休假日”上 路线,但我做错了什么?

根据您的场景和描述,您的

days-off-schedule
路由定义了 personId 的捕获组。这意味着每当使用路由时,它都会期望该参数的值,并且当在没有
Url.Action
参数的情况下调用
DaysOffSchedule
时,它会尝试匹配现有路由。

由于路由需要一个值,因此 ASP.NET MVC 使用“环境值” - 来自先前访问的页面的人员 ID(在您的情况下是 Smith 的时间表)。该值 (2) 包含在生成的 URL 中。

所以,你可以尝试以下方式:

<a href='@Url.Action("DaysOffSchedule", "DaysOff", new { personnelId = (int?)null })'>My schedule</a>

重构您的路线配置:

此外,还应修改路由配置如下:

  app.MapControllerRoute(
  name: "days-off-schedule",
  pattern: $"DaysOff/DaysOffSchedule/{personnelId?}", 
  defaults: new { controller = "DaysOff", action = "DaysOffSchedule" });

注意: 请记住“?”人员 ID 之后。通过将 personId 参数设为可选并指定默认值 null,ASP.NET 在生成 URL 时不会自动填充参数值,除非您显式提供该参数值。请参阅此官方文档了解更多详细信息和示例。

有没有办法避免添加空参数?

是的,您可以通过使用两个单独的路由定义来避免为 PersonnelId 参数添加空默认值:一个用于带参数的路由,另一个用于不带参数的路由

在这种情况下,您应该保留如下两个路由定义:

app.MapControllerRoute(
    name: "days-off-schedule-with-id",
    pattern: "DaysOff/DaysOffSchedule/{personnelId}",
    defaults: new { controller = "DaysOff", action = "DaysOffSchedule" });


app.MapControllerRoute(
    name: "days-off-schedule",
    pattern: "DaysOff/DaysOffSchedule",
    defaults: new { controller = "DaysOff", action = "DaysOffSchedule" });

替代方式:

您还可以使用 url 操作的条件渲染。您可以执行以下操作:

@if (personnelId == null)
{
    <a href='@Url.Action("DaysOffSchedule", "DaysOff")'>My schedule</a>
}
else
{
    <a href='@Url.Action("DaysOffSchedule", "DaysOff", new { personnelId = personnelId })'>Employee Schedule</a>
}
© www.soinside.com 2019 - 2024. All rights reserved.