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

ASP.NET Core中如何临时存储表单数据并传递给控制器Action方法

ASP.NET Core 航班搜索表单参数传递方案

你需要的类Rails params 哈希的实现方式在ASP.NET Core中原生支持,完全不需要创建和数据库绑定的持久化模型,同时也有更便捷的轻量方案可选:

1. 对应Rails params的直接取值方案(无需创建任何模型)

ASP.NET Core 中 Controller 基类自带和Rails params功能完全一致的表单参数集合,你可以用两种方式直接获取:

方式1:用IFormCollection作为Action参数接收

[HttpPost]
public IActionResult Search(IFormCollection form)
{
    // 用法和Rails的params[:key]完全一致,直接按字段名取值后转换类型即可
    int fromAirportId = int.Parse(form["FromAirportId"]);
    int toAirportId = int.Parse(form["ToAirportId"]);
    DateTime departureDate = DateTime.Parse(form["DepartureDate"]);
    int passengerCount = int.Parse(form["PassengerCount"]);
    
    // 执行搜索逻辑
    return View();
}

方式2:直接调用Request.Form (连参数都不需要加)

[HttpPost]
public IActionResult Search()
{
    int fromAirportId = int.Parse(Request.Form["FromAirportId"]);
    // 其余参数取值同上
}

2. 更推荐的轻量视图模型方案(无需和数据库绑定)

就算不需要持久化存储,也推荐你创建一个纯传输用的POCO类(普通C#类),只有几行代码,就能享受框架自带的模型自动绑定、类型校验、错误提示能力,比手动取字典转换类型更省心:

第一步:创建纯传输用的视图模型(和数据库完全无关)

在项目的Models文件夹下新建SearchFlightViewModel.cs:

public class SearchFlightViewModel
{
    public int FromAirportId { get; set; }
    public int ToAirportId { get; set; }
    public DateTime DepartureDate { get; set; }
    public int PassengerCount { get; set; }
}

第二步:Action直接接收模型参数

框架会自动把表单字段映射到模型属性,不需要你手动取值转换:

[HttpPost]
public IActionResult Search(SearchFlightViewModel searchParams)
{
    // 直接通过searchParams.FromAirportId等属性获取参数即可
}

你现有表单的问题修复

你现在的表单控件缺少name属性,且两个机场选择框的asp-for重复,提交时无法正确传递参数,修复后的代码如下:

<form asp-controller="SearchResults" asp-action="Search" method="post">
    <div class="form-group">
        <label for="fromAirport">Flying from:</label>
        <select name="FromAirportId" asp-items="@(new SelectList(ViewBag.ListOfAirports, "AirportId", "AirportCode"))" class="form-control">
        </select>
        <div class="form-group">
            <label for="toAirport">Flying to:</label>
            <select name="ToAirportId" asp-items="@(new SelectList(ViewBag.ListOfAirports, "AirportId", "AirportCode"))" class="form-control">
            </select>
        </div>
        <label for="departureDate">Departure Date:</label>
        <br />
        <input type="date" name="DepartureDate" id="departureDate" />
        <br />
        <label for="passengerCount">No. passengers:</label>
        <select name="PassengerCount" id="passengerCount" class="form-control">
            <option>1</option>
            <option>2</option>
            <option>3</option>
            <option>4</option>
        </select>
        <button type="submit" class="btn btn-primary mt-3">Search Flights</button>
    </div>
</form>

如果你用视图模型方案,还可以把name属性替换成asp-for(比如asp-for="FromAirportId"),框架会自动生成正确的name和id属性,进一步减少手写错误。


内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:15:02