我需要定义基于模板的路由到控制器,然后根据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
不幸的是,情况并非如此。看起来路由属性被忽略了。达到要求的最佳方式是什么?
答案 0 :(得分:0)
这里的技巧是将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的所有请求路由到控制器DoThing
上名为Foo
的操作。一旦它到达那里它会看到"哦,我的,哦,我的,有两个同名的动作!"但是它会看到[HttpGet]
和[HttpPost]
操作方法选择器,无论其中任何一个人说它可以处理请求都会获胜。