我使用的是Visual Studio 2019和ASP.Net Core 2.1。我在索引页面上有一个<ul>
列表,列表中的一个项目(从数据库生成)在名称中有一个“/”。列表项生成为:
<li>
<a href="/Home/Index/OBJECT-WITH-A-%2F-IN-IT">OBJECT-WITH-A-/-IN-IT</a>
</li>
如果我点击生成的链接,我会收到404错误:
No webpage was found for the web address:
https://localhost:12345/Home/Index/OBJECT-WITH-A-%2F-IN-IT
我的猜测是路由的东西在我想要它之前的某个时刻正在做一个URL解码。有没有办法通过这个{id}
原样?
编辑
我尝试了下面的事情,我为我标记了最好的答案,但由于其他问题,我回滚了我的更改,我的初始状态刚刚开始工作。我不明白为什么,但再次感谢。
您可以使用星号(*)或双星号(**)作为路由参数的前缀以绑定到URI的其余部分。这些被称为全能参数。
app.UseMvc(
routes =>
{
routes.MapRoute(
name: "defaults",
template: "{controller=Home}/{action=Index}/{*id}");
}
);
使用以下配置,您的示例工作正常
Startup.cs
/..
app.UseMvcWithDefaultRoute();
//or its equivalent
app.UseMvc(routes => {
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
HomeController.cs
public class HomeController {
[HttpGet]
public IActionResult Index(string id) {
//...
}
}
id
的价值等于"OBJECT-WITH-A-%2F-IN-IT"
。如果链接生成如下
<a href="/Home/Index/OBJECT-WITH-A-/-IN-IT">OBJECT-WITH-A-/-IN-IT</a>
它真的回归404 Not Found
。