You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
}

问题原因分析

  1. 参数接收方式不匹配:ReservationController的AddPassenger方法使用[FromRoute]标记参数,但FlightController跳转时是将flightId作为查询参数(URL中的?flightId=xxx)传递的。[FromRoute]用于从路由模板中提取参数,无法读取查询参数,导致参数无法正确接收。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:10:26