我刚才问了一个类似的问题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()
,但仍然可以在指定时路由到其他操作 - 并且能够实现此目的而无需用相同的方法标记每一个控制器和方法。
例如:
我尝试了许多不同的MapRoute组合以及不同类型的控制器和方法修饰,但找不到用("[action]")
标记绝对所有内容的替代方法。
在MapRoute
中使用app.addMvc
不起作用,因为如果我指定{action}
,则无法在不添加 / Get 的情况下达到Get()和Post() em>或 / Post 到我的请求结束时(与{action?}
没有区别。)
我得到的最接近的是{action=Get}
,它默认路由到GET方法,但是破坏了达到默认POST方法的能力。
这是否可能,如果是,有人知道怎么做?
答案 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);
}