我有一个带有大量控制器的ASP.NET Core 2.0 Web Api项目,所有这些控制器(当前)都是这种形式的一些变体:
[Route("api/[controller]")]
public class ExampleController : Controller
{
[HttpGet]
public MyType Get() => GetMyTypeFromSomewhere();
[HttpPost]
public void Post([FromBody]updated) => UpdateMyType(updated);
[HttpGet("[action]")]
public void SelectedOption() => Options.GetSelectedOption();
[HttpPost("[action]")]
public void SelectOption([FromBody]int id) => Options.SelectOption(id);
[HttpDelete("[action]")]
public void DeleteOption([FromBody]Guid id) => Options.DeleteOption(id);
}
您甚至可以从这个简单的示例中看到,在每个控制器的顶部都必须包含[Route("api/[controller]")]
,而在Http Verb属性中必须包含("[action]")
则更令人讨厌。每个非默认操作。
我希望能够在没有指定动作的情况下将请求默认路由到Get()
和Post()
,但在指定时仍可以路由到其他动作-并且能够实现这一点而不必标记每个控制器和方法有该死的东西。
例如:
我尝试了MapRoute的许多不同组合以及不同类型的控制器和方法修饰,但是找不到用("[action]")
标记所有内容的替代方法。
在MapRoute
中使用app.addMvc
不起作用,因为如果指定了{action}
,则在不向其中添加/ Get或/ Post的情况下无法到达Get()和Post()我的请求结束(与{action?}
没有区别)。我得到的最接近的是{action=Get}
,默认情况下会路由到GET方法,但会破坏达到默认POST方法的能力。
这是否有可能,如果有的话,有人知道吗?
我认为这只是删除路线中的动作的问题。如下:
属性路由不是更好的方法吗?
我总是将Route属性添加到类中。从那里,我用底部的默认路由对路由进行排序(排序很重要)。我还将使用约束来帮助使请求正确执行。我发现您的非默认Get和Post方法有点奇怪。当前如何设置它们,您将必须100%在非默认Get操作的属性中指定操作。