【问题标题】:How to assign multiple MVC routes to one method and determine the used route?如何将多个 MVC 路由分配给一种方法并确定使用的路由?
【发布时间】:2018-11-14 02:45:27
【问题描述】:

我有以下代码:

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 参数的值是什么。

【问题讨论】:

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


    【解决方案1】:

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

    你可以试试下面的代码——

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [Route("item/{direction}/{id}")]
        public string Move([FromRoute]string controller, [FromRoute]string action, string direction, string id)
        {
            return string.Format("Controller={0} Action={1} Direction={2} Id={3}", controller, action, direction, id);
        }
    }
    

    【讨论】:

    • 感谢您的回答。请注意,我的控制器是 MVC 控制器。我正在使用没有 Route 属性的普通路由。我的控制器有多个现有操作,例如创建、编辑和上/下操作。我想将这些动作组合到移动动作中。我已经尝试过您的解决方案,但我无法使用它。因为它会覆盖其他操作。只有当我将它放在单独的控制器中时它才能工作,这不是我正在寻找的简单解决方案。
    • 但是你给了我一个解决这个问题的想法:[Route("[controller]/move/{direction}/{id}")]。这不会在进入操作之前缩小向上/向下的路线,但由于我已经在检查direction,这不是一个真正的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2017-05-19
    • 2012-01-26
    相关资源
    最近更新 更多