在Razor视图中创建可传递选中模型至控制器的链接按钮
在MVC Razor视图中传递选中项数据到控制器
首先,你原代码里的链接标签有个小问题,<a>标签没有正确闭合,应该改成</a>哦。
回到你的问题,在ASP.NET MVC(或Core)里,我们可以利用Tag Helper的路由属性轻松传递参数到控制器方法,这里有几种常用方案,你可以根据需求选择:
1. 推荐:传递唯一标识(最安全简洁)
如果你的depFlight模型有一个唯一ID(比如FlightId),这是最优方案——只传递ID,然后在控制器里通过ID从数据源获取完整航班信息,既避免URL暴露过多数据,也更符合MVC的设计逻辑。
修改你的链接代码:
<a asp-action="BookingForm" asp-route-flightId="@fcoll.depFlight.FlightId">Choose</a>
然后在控制器中添加对应的方法接收参数:
public IActionResult BookingForm(int flightId) { // 根据flightId从数据库/服务中获取对应航班信息 var flight = _flightService.GetFlightById(flightId); // 处理预订逻辑,比如返回表单视图并传递数据 return View(flight); }
2. 直接传递多个字段(适合简单场景)
如果确实需要直接传递多个字段(比如出发地、目的地等),可以用多个asp-route-*属性,每个属性对应控制器方法的一个参数:
修改链接:
<a asp-action="BookingForm" asp-route-depLocation="@fcoll.depFlight.Location" asp-route-depAirport="@fcoll.depFlight.Airport" asp-route-arriveLoc="@fcoll.depFlight.ArriveLoc" asp-route-tarif="@fcoll.depFlight.Tarif">Choose</a>
控制器方法对应参数:
public IActionResult BookingForm(string depLocation, string depAirport, string arriveLoc, decimal tarif) { // 直接使用传递的参数构建预订视图模型 var viewModel = new BookingViewModel { DepLocation = depLocation, DepAirport = depAirport, // 其他字段赋值... }; return View(viewModel); }
3. 批量传递参数(适合多参数场景)
如果需要传递的参数很多,可以用asp-all-route-data属性,把参数包装成字典对象:
先在Razor视图里定义路由数据字典:
@{ var flightRouteData = new Dictionary<string, string> { { "flightId", fcoll.depFlight.FlightId.ToString() }, { "depTime", fcoll.depFlight.Time.ToString("yyyy-MM-dd HH:mm") }, { "arriveTime", fcoll.depFlight.ArriveTime.ToString("yyyy-MM-dd HH:mm") }, { "tarif", fcoll.depFlight.Tarif.ToString() } }; }
再使用链接:
<a asp-action="BookingForm" asp-all-route-data="flightRouteData">Choose</a>
控制器方法同样接收对应的参数即可。
注意事项
- 尽量避免在URL中传递敏感数据(比如用户隐私信息),用唯一ID查询是更安全的方式。
- 控制器方法的参数名称要和
asp-route-*的后缀保持一致(比如asp-route-flightId对应参数int flightId),大小写不敏感但建议统一。
内容的提问来源于stack exchange,提问作者user1238784
相关产品推荐
相关产品推荐

