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有效但对其他自定义属性无效?
RouteData将只包含与路由相关的数据。这是什么数据,取决于用于导航到您的操作的路由模板。
默认路由模板如下所示:{controller=Home}/{action=Index}/{id?}。忽略默认值,模板就是这样的:{controller}/{action}/{id?}。
因此,有3位在路由模板:controller,action,和可选的id。这些是您将能够看到的RouteData.Values值,因为这些值用于匹配路由模板。
当您查看由标签帮助程序生成的URL时,也可以看到此信息。它应该看起来有点像这样:/Home/Edit/123?firstname=name。该id是路线的一部分,而firstname仅仅作为查询参数传递。
这也意味着,您可以访问firstname通过HttpContext.Request.Query其中包含被传递的查询参数。请注意,id是不是,虽然,因为它是作为路线数据,而不是作为查询数据通过包含在那里。
现在,当您将模型绑定与控制器操作一起使用时,很幸运,您无需进行这种区分。通过默认行为,您只需将它们指定为操作方法的参数,即可获取路由参数和查询参数。当然,推荐使用模型绑定来访问这些值,建立机制RouteData.Values以及Request.Query相当低级的机制。