asp-route- *中的奇怪行为

sec*_*age 0 c# asp.net-core-mvc tag-helpers

在index.cshtml中,我使用锚标记助手作为

<a asp-action="Edit" asp-route-id="@Model.Id" asp-route-firstname="@Model.Name"</a>
Run Code Online (Sandbox Code Playgroud)

并在动作方法中

public IActionResult Edit(string id, string firstname)
{
   // id and firstname are assigned correct values
   // but  RouteData.Values only has three entries which are: controller, action and id, where is firstname?
}
Run Code Online (Sandbox Code Playgroud)

但是我不能通过访问访问firstname值,RouteData.Values["firstname"];而可以通过访问id值RouteData.Values["id"];,为什么它对id有效但对其他自定义属性无效?

pok*_*oke 5

RouteData将只包含与路由相关的数据。这是什么数据,取决于用于导航到您的操作的路由模板。

默认路由模板如下所示:{controller=Home}/{action=Index}/{id?}。忽略默认值,模板就是这样的:{controller}/{action}/{id?}

因此,有3位在路由模板:controlleraction,和可选的id。这些是您将能够看到的RouteData.Values值,因为这些值用于匹配路由模板。

当您查看由标签帮助程序生成的URL时,也可以看到此信息。它应该看起来有点像这样:/Home/Edit/123?firstname=name。该id是路线的一部分,而firstname仅仅作为查询参数传递。

这也意味着,您可以访问firstname通过HttpContext.Request.Query其中包含被传递的查询参数。请注意,id不是,虽然,因为它是作为路线数据,而不是作为查询数据通过包含在那里。

现在,当您将模型绑定与控制器操作一起使用时,很幸运,您无需进行这种区分。通过默认行为,您只需将它们指定为操作方法的参数,即可获取路由参数和查询参数。当然,推荐使用模型绑定来访问这些值,建立机制RouteData.Values以及Request.Query相当低级的机制。