我有一个菜单,我可以从中设置一个不带参数的页面链接:
<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 将最后使用的参数附加到链接,而我没有提供任何参数?问题显然出在“偏离计划的日子”路线上,但我做错了什么?
为什么 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>
}