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
相关产品推荐
相关产品推荐

