最简洁的方法来处理动作路由,同时保持ASP.NET Core 2.0 MVC中的GET和POST操作的默认路由

时间:2017-10-16 19:15:23

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0

我刚才问了一个类似的问题here,但并没有真正说出来或者正确地解释我想要实现的目标。我正在再试一次,并尝试更好地解释它!

我有一个带有众多控制器的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中包含("[action]") <每个非默认操作的em> Verb 属性。

我希望能够为没有指定操作的请求默认路由到Get()Post(),但仍然可以在指定时路由到其他操作 - 并且能够实现此目的而无需用相同的方法标记每一个控制器和方法。

例如:

  • 获取mysite.com/api/Example
    应该返回MyType的实例
  • POST mysite.com/api/Example
    应该采用MyType的实例
  • 获取mysite.com/api/Example/SelectedOption
    应该返回一个int
  • POST mysite.com/api/Example/SelectOption
    应该采取一个int
  • 删除mysite.com/api/Example/DeleteOption
    应该采取一个int

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

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

这是否可能,如果是,有人知道怎么做?

3 个答案:

答案 0 :(得分:-1)

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

routes.MapRoute("default", "api/{controller=Values}/{id?}");

希望它有所帮助!

答案 1 :(得分:-1)

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

E.g。在类级别声明[Route(“api / example”)],然后你的动作可以是你的动词,使用相关的属性,例如[HttpGet]等。

答案 2 :(得分:-1)

我总是将Route属性添加到类中。从那里我订购我的路线与底部的默认路线(订单事项)。 我也会使用约束来帮助珊瑚请求正确的操作。 我发现你的非默认Get和Post方法有点奇怪。您当前如何设置它们,您将100%必须在非默认Get操作的属性中指定操作。

你能不能只从post方法返回选项? 我通常喜欢避免使用动作名称(如果可能),因为我觉得它使api更容易使用。

无论如何,对不起,如果我误解了你想要完成的事情。

以下是Id如何编写控制器:

[Route("api/[controller]")]
public class ExampleController : Controller
{
    [HttpGet]
    public MyType Get() => GetMyTypeFromSomewhere();

    [HttpPost("{id:int}")
    public IActionResult SelectOption(int id) 
    {
        Options.SelectOption(id);
        var option = Options.GetSelectedOption( );
        return Ok( option );
    }

    [HttpGet("[action]")]
    public IActionResult SelectedOption( ) 
    { 
       var option = Options.GetSelectedOption( );
       return Ok( option );
    } 

    [HttpPost]
    public void Post([FromBody]updated) => UpdateMyType(updated);

    [HttpDelete("{id:guid}")
    public void DeleteOption(Guid id) => Options.DeleteOption(id);
}