ASP.NET Core 6 MVC中URL传递flightId失败问题求助
问题排查:ASP.NET Core 6 MVC中flightId参数传递失败
问题描述
在ASP.NET Core 6 MVC中尝试从FlightController通过URL将flightId传递到ReservationController的AddPassenger方法,点击预订后URL未携带该参数,最终URL为https://localhost:2213/Reservation/AddPassenger?.。
相关控制器代码
FlightController代码
[HttpGet] public IActionResult SearchFlights(string origin, string destination, DateTime departureDate) { var flights = _context.Flights .Where(f => f.DepartureAirport == origin && f.ArrivalAirport == destination && f.DepartureDatetime.Date == departureDate.Date) .ToList(); ViewBag.Origin = origin; ViewBag.Destination = destination; ViewBag.DepartureDate = departureDate; return View(flights); } [HttpPost] public IActionResult SearchFlights(int flightId) { string url = string.Format("/Reservation/AddPassenger?flightId={0}", flightId); return Redirect(url); }
ReservationController代码
[HttpGet] public IActionResult AddPassenger([FromRoute] int flightId) { return View(); } [HttpPost] [ValidateAntiForgeryToken] public IActionResult AddPassenger(Passenger passanger, [FromRoute] int flightId) { Passenger passenger = new Passenger() { Name = passanger.Name, Email = passanger.Email, PhoneNumber = passanger.PhoneNumber, PassportNumber = passanger.PassportNumber, PaymentMethod = passanger.PaymentMethod, }; _context.Passengers.Add(passenger); _context.SaveChanges(); int passengerId = passenger.PassengerId; Reservation reservation = new Reservation() { FlightId = flightId, SeatId = 2, PassengerId = passengerId, ReservationStatus= "Confirmed", ReservationDate= DateTime.Now, }; _context.Reservations.Add(reservation); _context.SaveChanges(); return RedirectToAction("Index"); }
问题原因分析
- 参数接收方式不匹配:ReservationController的AddPassenger方法使用
[FromRoute]标记参数,但FlightController跳转时是将flightId作为查询参数(URL中的?flightId=xxx)传递的。[FromRoute]用于从路由模板中提取参数,无法读取查询参数,导致参数无法正确接收。 - flightId可能未正确传入Post方法:FlightController的Post版
SearchFlights方法中的flightId参数如果没有从前端表单正确获取,会导致拼接URL时参数为空,最终出现/Reservation/AddPassenger?.的异常URL。
解决方案
方案1:修正参数接收方式(匹配查询参数传递)
将ReservationController中AddPassenger方法的[FromRoute]改为[FromQuery],匹配查询参数的传递方式:
[HttpGet] public IActionResult AddPassenger([FromQuery] int flightId) { return View(); } [HttpPost] [ValidateAntiForgeryToken] public IActionResult AddPassenger(Passenger passanger, [FromQuery] int flightId) { // 原有业务逻辑保持不变 }
方案2:改用路由参数传递(RESTful风格推荐)
如果希望用路由参数传递flightId,需调整跳转逻辑和控制器路由配置:
- 修改FlightController的跳转代码:
[HttpPost] public IActionResult SearchFlights(int flightId) { // 使用RedirectToAction更符合MVC规范,自动生成正确路由 return RedirectToAction("AddPassenger", "Reservation", new { flightId }); }
- 修改ReservationController的路由和参数接收:
// 显式定义路由模板,包含flightId参数 [HttpGet("Reservation/AddPassenger/{flightId}")] public IActionResult AddPassenger([FromRoute] int flightId) { return View(); } [HttpPost("Reservation/AddPassenger/{flightId}")] [ValidateAntiForgeryToken] public IActionResult AddPassenger(Passenger passanger, [FromRoute] int flightId) { // 原有业务逻辑保持不变 }
方案3:确保前端正确传递flightId
检查前端预订按钮所在的表单,确保包含name为flightId的隐藏域或输入框,将选中航班的flightId正确传递到FlightController的Post方法:
<!-- SearchFlights视图中的预订表单示例 --> @foreach (var flight in Model) { <form asp-action="SearchFlights" asp-controller="Flight" method="post"> <input type="hidden" name="flightId" value="@flight.FlightId" /> <button type="submit">预订此航班</button> </form> }
内容的提问来源于stack exchange,提问作者Jon Fetahi
相关产品推荐
相关产品推荐

