加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

如何在ASP.NET Core中组合基于模板和属性的路由?

发布时间:2020-12-16 09:20:08 所属栏目:asp.Net 来源:网络整理
导读:我需要定义基于模板的路由到控制器,然后根据ASP.NET Core中的操作进行属性.就像是: public class Foo : Controller{ [HttpGet] public object Get() { return new { ID = "A" }; } [HttpPost] public object Create([FromBody]dynamic entity) { return new
我需要定义基于模板的路由到控制器,然后根据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

不幸的是,情况并非如此.看起来路由属性被忽略了.达到要求的最佳方法是什么?

解决方法

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

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

app.UseMvc(routes =>
{
    routes.MapRoute(
        "Settings",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]动作方法选择器,无论其中任何一个说它能处理请求都会获胜.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读