c# - asp-route-* 中的奇怪行为
问题描述
在 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?
}
但是我无法访问 firstname 值RouteData.Values["firstname"];
,我可以访问 id 值RouteData.Values["id"];
,为什么它适用于 id 而不适用于任何其他自定义属性?
解决方案
RouteData
将仅包含与路由相关的数据。这是什么数据取决于用于导航到您的操作的路由模板。
默认路由模板如下所示:{controller=Home}/{action=Index}/{id?}
. 忽略默认值,模板就是这样的:{controller}/{action}/{id?}
.
所以路由模板中有三个插槽:controller
、action
和一个可选的id
。这些是您将能够看到的值,RouteData.Values
因为这些值用于匹配路由模板。
当您查看标签助手生成的 URL 时,您也可以看到这一点。它应该看起来像这样:/Home/Edit/123?firstname=name
. id
是路由的一部分,而仅firstname
作为查询参数传递。
这也意味着您可以firstname
通过which访问HttpContext.Request.Query
包含传递的查询参数。请注意,id
这里不包括在内,因为它是作为路由数据而不是作为查询数据传递的。
现在,当您将模型绑定与控制器操作一起使用时,幸运的是,您不需要进行这种区分。默认行为将允许您通过简单地将路由参数和查询参数指定为操作方法的参数来获取它们。并且使用模型绑定当然是访问这些值的推荐方法,这是一种RouteData.Values
相当Request.Query
低级的机制。
推荐阅读
- flutter - 无法使用 Minio (Flutter) 从 s3 存储桶中检索图片
- python - Pybind11 如何从 python -> c++ 传递一个 n 维 numpy 数组
- javascript - 在 If 语句调整 img 后,else 语句不重新调整 img 的高度和宽度
- postgresql - 如何使用副本从带有变量的 url 读取 json 文件以更改日期间隔?
- reactjs - 如何在一个输入中组合两个状态变量
- spring - 使用 javax.xml.catalog.files 时 Spring 无法启动
- linq - LINQ - .Any 用于类类型列表
和类类型字符串 - flutter - 控制输入颤振
- reactjs - 测试复选框的初始选中状态
- kotlin - Micronaut Data 简单的父/子关系