Web api - 如何使用 slugs 进行路由?

Pat*_*ski 4 c# routes asp.net-web-api

我希望能够解析像这个问题这样的链接:

http://stackoverflow.com/questions/31223512/web-api-how-to-route-using-slugs
Run Code Online (Sandbox Code Playgroud)

因此服务器上的路由只需忽略URL 的最后部分。作为使用这个问题的示例,如果有人输入这样的 URL,我如何正确实现路由,它会将我重定向到:

http://stackoverflow.com/questions/31223512
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 6

参考:处理 URL 模式中可变数量的段

有时您必须处理包含可变数量 URL 段的 URL 请求。定义路由时,您可以指定如果 URL 的段数多于模式中的段数,则多余的段将被视为最后一个段的一部分。要以这种方式处理其他段,请用星号 (*) 标记最后一个参数。这被称为包罗万象的参数。具有 catch-all 参数的路由还将匹配最后一个参数不包含任何值的 URL。

基于约定的路线可以映射为...

config.Routes.MapHttpRoute(
    name: "QuestionsRoute",
    routeTemplate: "questions/{id}/{*slug}",
    defaults: new { controller = "Questions", action = "GetQuestion", slug = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

或者,使用属性路由,路由可能看起来像......

[Route("questions/{id:int}/{*slug?}")]
Run Code Online (Sandbox Code Playgroud)

这都可以匹配示例控制器操作......

public IActionResult GetQuestion(int id, string slug = null) {...}
Run Code Online (Sandbox Code Playgroud)

示例网址...

"questions/31223512/web-api-how-to-route-using-slugs"
Run Code Online (Sandbox Code Playgroud)

然后将参数匹配如下......

  • id = 31223512
  • slug = "web-api-how-to-route-using-slugs"

因为slug是可选的,所以上面的 URL 仍然会匹配到

"questions/31223512"
Run Code Online (Sandbox Code Playgroud)

这应该满足您的要求。