我有一个asp.net核心2.2 mvc操作方法,并通过客户端JavaScript代码GET
来实现:
[Route("/search/{searchterm}")]
public IActionResult Search(string searchterm)
{
// code
}
现在,当我导航到使用搜索字符串abc/def
进行搜索时
浏览器中的uri为/search/abc%2Fdef
,因为/被编码了
我得到一个404
,因为路由属性解码了斜杠,并且说/search/abc/def
与我的路线不匹配。
我想要的是将%2F
视为正常的内容,因此搜索字符串位于abc/def
的我的操作方法内。
有趣的是,这不是在我从VS2017运行的本地计算机上发生的(我猜它运行Kestrel),而是在IIS上运行的测试服务器上发生。
这是IIS吗?还是负载均衡器正在做某事?
答案 0 :(得分:3)
您可以使用星号表示searchterm
可以包含斜杠。这称为catch-all parameter,看起来像这样:
[Route("/search/{**searchterm}")]
public IActionResult Search(string searchterm)
{
// code
}
从文档中:
您可以使用星号(
*
)或双星号(**
)作为路由参数的前缀,以绑定到URI的其余部分。这些称为全部参数。例如,blog/{**slug}
与以/blog
开头且后跟任何值的所有URI匹配,该值被分配给段路由值。 Catch-all参数也可以匹配空字符串。在使用路由生成URL时,catch-all参数将转义相应的字符,包括路径分隔符(/)。例如,具有路由值
foo/{*path}
的路由{ path = "my/path" }
生成foo/my%2Fpath
。请注意转义的正斜杠。要往返路径分隔符,请使用**
路由参数前缀。带有foo/{**path}
的路由{ path = "my/path" }
生成foo/my/path
。