如何指定asp-action但不在URL中呈现它

时间:2019-01-30 14:08:50

标签: asp.net-core routing

我有一个控制器:

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-*属性找到正确的语法。

1 个答案:

答案 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}