Url.Action 从哪里得到这些值?

Where is Url.Action getting these values from?

我正在尝试使用 Url.Action 为以下 GET 操作创建一个 link:

public class FooController : Controller
{
    [HttpGet]
    [Route("Foo/Apply/BarDetails/Part/{id}")]
    public IActionResult BarDetails(int id)
    {
    }
}

在我看来,我正在创建一个 URL with

Url.Action("BarDetails", "Foo", new {id = 1})

然而这会生成 URL Foo/Apply/BarDetails/Part/10?id=1 这绝对不是我想要的!删除 values 参数只会删除 URL 的查询字符串部分。我在启动时注册的唯一路线是

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

我看过 ASP.NET 核心源代码,我怀疑 URL 的“10”部分来自某个地方的 "1" + "0" 操作,因为路由代码分为 2 个以上的回购协议,很难理解。有谁知道这个 URL 的最后一部分是如何生成的以及我如何修复它以匹配路由值中提供的 id

您可以在基于属性的路由中设置可选路由参数的最大和最小范围。按照下面的代码

enter code here [Route("Licence/Apply/Details/Part/{id:int:max(1000):min(10)}}")]

事实证明,路由在 MVC5(编写此控制器的地方)和 ASP.NET Core 2 之间发生了变化。这也与我构建控制器的方式有关。基本上在某些时候,可能的路线列表按 URL 排序,因此 Foo/Apply/BarDetails/Part/10 被排序到列表的顶部,并且因为它与请求的 URL 匹配,所以它被返回。有关完整详细信息,请参阅 this GitHub issue