如何在ASP.NET Core中实现模板与属性路由的完美融合?

2026-03-30 11:311阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计417个文字,预计阅读时间需要2分钟。

如何在ASP.NET Core中实现模板与属性路由的完美融合?

我需要定义一个基于模板的路由到控制器,然后根据ASP.NET Core中的操作特性进行操作。例如:

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

[HttpPost] public object Create([FromBody] string data) { // 处理创建逻辑 }}

我需要定义基于模板的路由到控制器,然后根据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之间切换.

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

如何在ASP.NET Core中实现模板与属性路由的完美融合?

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

本文共计417个文字,预计阅读时间需要2分钟。

如何在ASP.NET Core中实现模板与属性路由的完美融合?

我需要定义一个基于模板的路由到控制器,然后根据ASP.NET Core中的操作特性进行操作。例如:

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

[HttpPost] public object Create([FromBody] string data) { // 处理创建逻辑 }}

我需要定义基于模板的路由到控制器,然后根据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之间切换.

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

如何在ASP.NET Core中实现模板与属性路由的完美融合?

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