ASP.NET MVC中如何将下拉选框的Category ID传递到控制器实现筛选功能
解决ASP.NET MVC中下拉选框传递分类ID到控制器的问题
你遇到的问题主要出在参数匹配和值绑定两个地方,咱们一步步来修复:
问题核心分析
- 参数名称不匹配:下拉选框的
name属性是category,但控制器方法的参数是cid,ASP.NET MVC的模型绑定无法识别这两个不匹配的名称,导致参数接收不到值。 - Option值绑定错误:你把option的value写死成了字符串
"category.Name",而不是动态绑定分类的Id值,这就导致提交的不是实际分类ID,而是固定字符串。
修复步骤
1. 修改视图文件(Index.cshtml)
把下拉选框的name改成和控制器参数一致的cid,同时把option的value绑定到category.Id:
<form asp-controller="Getjob" asp-action="viewJob"> <select name="cid" class="form-control"> <option value="0">Choose Category</option> @foreach (var category in Model.ListB) { <option value="@category.Id">@Html.DisplayFor(modelItem => category.Name)</option> } </select> <br><br> <input type="submit" class="btn btn-lg btn-success" value="FIND"> </form>
2. 优化控制器方法(可选但推荐)
你当前的筛选逻辑可以用EF Core的Linq查询直接优化,避免先加载所有数据到内存再循环筛选,性能更优:
[HttpPost] public IActionResult viewJob(int cid) { // 处理用户未选择分类的场景(cid为0) if (cid == 0) { using (var db = new JobportalContext()) { var allJobs = db.Jobs.ToList(); return View(allJobs); } } using (var db = new JobportalContext()) { // 直接在数据库层面完成筛选,减少内存占用 var jobsFiltered = db.Jobs.Where(j => j.Cid == cid).ToList(); return View(jobsFiltered); } }
修改说明
- 表单元素的
name属性必须和控制器参数名一致,这样ASP.NET MVC的模型绑定才能正确将提交的值映射到参数上。 @category.Id会动态渲染每个分类的实际ID值,确保提交的是正确的分类标识,而不是固定字符串。
这样修改后,当用户选择分类并点击FIND按钮,控制器就能正确接收到分类的Id值,顺利完成筛选功能。
内容的提问来源于stack exchange,提问作者mordor619
相关产品推荐
相关产品推荐

