我的控制器看起来像:
[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 必须始终遵循另一个参数才能工作,这对我来说似乎是一个绝对的骨头限制。我在这里错过了什么吗?有什么想法可以使用这个静态路由吗?
答案 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()
{
...
}
}
<强> *提示:强>
答案 1 :(得分:1)
[HttpPost("~/api/{foo=foo}.{format?}")]
基本上,我只是创建一个虚拟参数,我的动作实际上并没有使用我想要的路径片段的默认值。这满足了可选格式参数遵循另一个参数的要求,同时仍让我静态设置我的路径。
第一部分(~/api/
)只是一种指定路径的方式,而不必更改我的控制器范围路由。换句话说,任何其他操作仍然以api/foo/
为前缀。
无论有什么用,我猜。