ASP.Net Core 2.1:通过路由传递urlencoded“id”?

问题描述 投票:0回答:2

我使用的是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}原样?

编辑

我尝试了下面的事情,我为我标记了最好的答案,但由于其他问题,我回滚了我的更改,我的初始状态刚刚开始工作。我不明白为什么,但再次感谢。

asp.net-core
2个回答
2
投票

您可以使用星号(*)或双星号(**)作为路由参数的前缀以绑定到URI的其余部分。这些被称为全能参数。

app.UseMvc(
    routes =>
    {
        routes.MapRoute(
            name: "defaults",
            template: "{controller=Home}/{action=Index}/{*id}");
    }
);

你可以参考Route template reference


0
投票

使用以下配置,您的示例工作正常

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

© www.soinside.com 2019 - 2024. All rights reserved.