在ASP.NET Core 2.0 MVC中,处理动作路由同时保持到GET和POST动作的默认路由的最简洁的方法是什么?

问题描述 投票:-1回答:3

我有一个带有大量控制器的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(),但在指定时仍可以路由到其他动作-并且能够实现这一点而不必标记每个控制器和方法有该死的东西。

例如:

  • GET mysite.com/api/Example应该返回MyType的实例
  • POST mysite.com/api/Example应该使用MyType的实例
  • GET mysite.com/api/Example/SelectedOption应该返回一个int
  • POST mysite.com/api/Example/SelectOption应该带一个整数
  • DELETE mysite.com/api/Example/DeleteOption应该带一个整数

我尝试了MapRoute的许多不同组合以及不同类型的控制器和方法修饰,但是找不到用("[action]")标记所有内容的替代方法。

MapRoute中使用app.addMvc不起作用,因为如果指定了{action},则在不向其中添加/ Get/ Post的情况下无法到达Get()和Post()我的请求结束(与{action?}没有区别)。我得到的最接近的是{action=Get},默认情况下会路由到GET方法,但会破坏达到默认POST方法的能力。

这是否有可能,如果有的话,有人知道吗?

c# asp.net-core asp.net-core-mvc asp.net-core-2.0
3个回答
-1
投票

我认为这只是删除路线中的动作的问题。如下:


-1
投票

属性路由不是更好的方法吗?


-1
投票

我总是将Route属性添加到类中。从那里,我用底部的默认路由对路由进行排序(排序很重要)。我还将使用约束来帮助使请求正确执行。我发现您的非默认Get和Post方法有点奇怪。当前如何设置它们,您将必须100%在非默认Get操作的属性中指定操作。

© www.soinside.com 2019 - 2024. All rights reserved.