【问题标题】:How to combine template and attribute based routing in ASP.NET Core?如何在 ASP.NET Core 中结合基于模板和属性的路由?
【发布时间】:2016-02-22 20:53:24
【问题描述】:

我需要定义基于模板的路由到控制器,然后在 ASP.NET Core 中为操作定义基于属性。比如:

public class Foo : Controller
{
    [HttpGet]
    public object Get()
    {
        return new
        {
            ID = "A"
        };
    }

    [HttpPost]
    public object Create([FromBody]dynamic entity)
    {
        return new
        {
            ID = "B"
        };
    }


}

路线

app.UseMvc(routes =>
        {
            routes.MapRoute("Settings", "settings/api/foo",
                    new { controller = "Foo" }
            );
        });

我希望这能奏效:

GET /settings/api/foo
POST /settings/api/foo

不幸的是,事实并非如此。看起来路由属性被忽略了。实现需求的最佳方式是什么?

【问题讨论】:

  • GET 和 POST 都得到 404 吗?
  • 那些 ([HttpPost] & [HttpGet]) 不是路由属性,它们是 HTTP 方法属性。路由属性看起来像[Route("settings/api/foo")]
  • @danludwig 他们是 IRouteTemplateProvider 所以他们是路由属性
  • @Shyju 是的,我可以在路由中使用带有方法限制的 hack,但这是每个控制器的 x4 映射,我想避免这种情况
  • 对不起,我没有把这个作为核心 1.0 问题来阅读。

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

这里的技巧是将 URL 路由到特定的控制器 操作。然后使用动作方法重载和动作方法选择器在GET和POST之间切换。

将您的路线设置代码更改为:

app.UseMvc(routes =>
{
    routes.MapRoute(
        "Settings",
        "settings/api/foo",
        new {
            controller = "Foo", // specific controller
            action = "DoThing", // AND specific action
        }
    );
});

然后将控制器更改为具有两种操作方法(或者您想要的多种操作方法 - 每个 HTTP 动词一个)具有相同的名称,但使用不同的操作方法选择器:

public class FooController : Controller
{
    [HttpGet] // different action method selector!
    public object DoThing() // same name!
    {
        return new
        {
            ID = "A"
        };
    }

    [HttpPost] // different action method selector!
    public object DoThing([FromBody]dynamic entity) // same name!
    {
        return new
        {
            ID = "B"
        };
    }
}

这样,MVC 会将对该 URL 的所有请求路由到控制器 Foo 上名为 DoThing 的操作。一旦它到达那里,它就会看到“哦,我的,哦,我的,有两个同名的动作!”但随后它会看到 [HttpGet][HttpPost] 操作方法选择器,并且其中任何一个说它可以处理请求都会获胜。

【讨论】:

  • 我的错是我试图简化代码以显示问题。这不适用于 HttpGet("{id}")、HttpDelete("{id}")。所以问题还是一样的,如何使用基于模板的路由路由到控制器,然后使属性路由起作用。
猜你喜欢
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多