我有一个控制器:
public class StaffController
{
[HttpGet("staff/{id}")]
public async Task<IActionResult> GetStaffMembers(int id)
{
return View("Staff", new StaffViewModel(id));
}
}
我想从链接触发:
<a asp-controller="Staff" asp-action="GetStaffMembers" asp-route-id="@Model.Id">Click here for @Model.Id</a>
这是路由到staff/getstaffmembers/1
使用asp锚属性,如何使它进入staff/1
?
注意:
我已经知道我可以使用<a href="/staff/@Model.Id" ...
,并且想为asp-*
属性找到正确的语法。
答案 0 :(得分:1)
有趣。通过将明确的路由属性应用于该操作,就不会发生这种情况。从本质上讲,它似乎已退回到默认路由。不过,通常在控制器级别定义一个路由前缀,所以这样做也许可以解决该问题:
[Route("staff")]
public class StaffController
{
[HttpGet("{id}")]
public async Task<IActionResult> GetStaffMembers(int id)
{
return View("Staff", new StaffViewModel(id));
}
}
或者,您可以简单地给路由命名,然后显式引用它:
[HttpGet("staff/{id}", Name = "GetStaffMembers")]
然后:
<a asp-route="GetStaffMembers" asp-route-id="@Model.Id">...</a>
可能是问题的最后一件事,与第一件事有关。由于您的控制器本身没有显式路由,因此可能无法正确找到相对路由。将其设置为绝对值可能会有所帮助:
[HttpGet("~/staff/{id}")]
从本质上讲,无论路由或控制器发生什么其他情况,都使该路由仅为/staff/{id}
。