Url.Action从哪里获取这些值?

时间:2017-12-05 17:26:21

标签: c# asp.net-core-mvc .net-core asp.net-core-2.0 asp.net-routing

我正在尝试使用Url.Action创建指向以下GET操作的链接:

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

在我看来,我正在用

创建一个URL
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+ repos it's难以理解。有谁知道如何生成此URL的最后部分以及如何修复它以匹配路由值中提供的id

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

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

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