asp-route- *中的奇怪行为

时间:2019-08-25 13:29:28

标签: c# asp.net-core-mvc tag-helpers

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

<a asp-action="Edit" asp-route-id="@Model.Id" asp-route-firstname="@Model.Name"</a>

以及操作方法

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?
}

但是我无法通过RouteData.Values["firstname"];访问firstname值,并且可以通过RouteData.Values["id"];访问id值,它如何用于id但不能用于其他任何自定义属性?

1 个答案:

答案 0 :(得分:5)

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

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

因此,路由模板中有三个插槽:controlleraction和可选的id。这些是您将在RouteData.Values中看到的值,因为这些值用于匹配路由模板。

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

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

现在,当您在控制器操作中使用model binding时,很幸运,您无需进行这种区分。通过默认行为,您只需将它们指定为操作方法的参数,即可获取路由参数和查询参数。当然,使用模型绑定无疑是访问这些值的推荐方法,这使RouteData.ValuesRequest.Query成为低级机制。