使用空路由

时间:2017-08-23 04:45:19

标签: asp.net-core asp.net-core-2.0

我的控制器看起来像:

[FormatFilter]
[Route("api/foo")]
public class FooController : Controller
{
    [HttpPost("")]
    public IActionResult Foo()
    {
        ...
    }
}

我想添加一个可选的格式扩展名documented here。但是,我希望路径最终像`/api/foo.json'。以下失败引人注目,为所有变化返回404.

[HttpPost(".{format?}"]

我的下一步想法是:

[HttpPost("foo.{format?}")]

有效地将控制器范围路径的该部分移动到该操作。然而,然后提出500,错误:

  

错误:在段'foo。{format?}'中,可选参数'format'前面是无效段'foo。'。只有句点(。)可以在可选参数之前。

显然, 唯一可以工作的是:

[HttpPost("{id}.{format?}"]

换句话说,似乎可选格式param 必须始终遵循另一个参数才能工作,这对我来说似乎是一个绝对的骨头限制。我在这里错过了什么吗?有什么想法可以使用这个静态路由吗?

2 个答案:

答案 0 :(得分:3)

容易愚蠢 *(经过多次试验和错误后)

[FormatFilter]
[HttpPost("foo"), HttpPost("foo.{format}")]
public class FooController : Controller
{
    [HttpPost("")]
    public IActionResult Foo()
    {
        ...
    }
}

[FormatFilter]
    [HttpPost, Route("foo"), Route("foo.{format}")]
    public class FooController : Controller
    {
        [HttpPost("")]
        public IActionResult Foo()
        {
            ...
        }
    }

<强> *提示:

  • 可选参数'format'前面有无效的段 '富'。只有句点(。)可以在可选参数
  • 之前
  • 操作接受多个路径模板

答案 1 :(得分:1)

显然,我很快就放弃了,尽管这必须是我曾经想过的最荒谬的解决方案之一。

[HttpPost("~/api/{foo=foo}.{format?}")]

基本上,我只是创建一个虚拟参数,我的动作实际上并没有使用我想要的路径片段的默认值。这满足了可选格式参数遵循另一个参数的要求,同时仍让我静态设置我的路径。

第一部分(~/api/)只是一种指定路径的方式,而不必更改我的控制器范围路由。换句话说,任何其他操作仍然以api/foo/为前缀。

无论有什么用,我猜。