如何将多种MVC路由分配给一种方法并确定使用的路由?

时间:2018-11-14 02:45:27

标签: asp.net-core-mvc asp.net-core-routing

我有以下代码:

public IActionResult Up(int id)
{
    return Move(id, "up");
}

private IActionResult Move(int id, string action)
{
    // Do something based on the action
    switch (action)
    {
        case "up":
            break;
        case "down":
            break;
    }
}

这很好,并且易于维护。但是现在我认为我可以通过组合方法来重构代码:

[Route("item/up/{id}")]
[Route("item/down/{id}")]
public IActionResult Move([FromRoute]string action, [FromRoute]int id)
{
}

链接/item/up/155将按此方法命中,而链接/item/up2/155返回NotFound,按预期。

现在的问题是,当我检查action的值时,它不包含值up,而是值Move

这似乎很奇怪,因为控制器名称未转换为ItemController。因此,可以认为该值应为up。但是,假设这是设计并且不会改变,那么我如何找到实际值?

我可以解析Request.Path.Value(=“ / item / up / 155”),但我不想这样做,因为我想保持简单。

因此,我正在寻找一种简单的方法来将多个路由分配给一个方法,然后确定所使用的路由路径中的action参数的值是什么。

2 个答案:

答案 0 :(得分:0)

您可以将其视为参数,而不是在路线声明中将方向硬编码为“上”和“下”。由于您将关键字“操作”用作参数,因此在参数绑定期间,将为其分配框架选择的实际操作方法。

您可以尝试以下代码-

IndyTextEncoding(TEncoding::ASCII)

答案 1 :(得分:-1)

Ryan建议使用Route constraints。这似乎是一个非常好的选择。尽管正则表达式通常会增加复杂性,但我认为这很容易:

[Route("[controller]/{direction:regex(^(up|down)$)}/{id}")]
public IActionResult Move(string action, string direction, int id)

如预期的action=Movedirection=up

优点是,只有updown可用作路由,并且不会干扰其他路由。