ASP.NET Core MVC视图向控制器传参为空问题求助
解决ASP.NET Core MVC中DropDownList参数传递为null的问题
你遇到的核心问题是表单提交的参数名称和控制器方法的参数不匹配,再加上代码里的小笔误,导致模型绑定无法正确映射值。让我一步步帮你解决:
1. 先修正控制器里的类名笔误
你在Index方法创建职位列表时,错误用了JobsTitle(多了个s),但模型类是JobTitle,这会导致编译错误或数据传递异常:
// 原错误代码 var jobs = new List<JobsTitle>() { new JobsTitle() { Id = 0, Title = "Manager" } , new JobsTitle() { Id = 1, Title = "Programmer" } }; // 修正后 var jobs = new List<JobTitle>() { new JobTitle() { Id = 0, Title = "Manager" } , new JobTitle() { Id = 1, Title = "Programmer" } };
2. 让控制器参数和表单提交字段匹配
你的视图用DropDownListFor(m => m.Location.Title)生成的表单元素,name属性是Location.Title,但控制器Post方法的参数是answer1和answer2,两者完全不对应,模型绑定找不到对应值,自然返回null。这里给你两种可行方案:
方案一:用CommonEntity接收参数(推荐)
既然视图已经绑定到CommonEntity,直接用这个模型类作为Post方法的参数,ASP.NET Core会自动完成模型绑定:
[HttpPost] public string Find(CommonEntity model) { // 直接获取选中值 var selectedLocation = model.Location.Title; var selectedJob = model.JobTitle.Title; return $"选中地点:{selectedLocation},选中职位:{selectedJob}"; }
方案二:修改参数名匹配表单字段
如果你不想用模型接收,需要把参数名改成和表单提交的name一致(模型绑定会把.转换成下划线格式):
[HttpPost] public string Find(string location_title, string jobtitle_title) { return $"选中地点:{location_title},选中职位:{jobtitle_title}"; }
3. 优化DropDownList的绑定逻辑(可选)
实际开发中更推荐绑定到模型的Id属性(传递ID比直接传递Title更稳定),同时确保SelectList的Value和Text设置正确:
@using Stargate.Core.Models.CoreEntities @model CommonEntity @using (Html.BeginForm()) { @Html.DropDownListFor(m => m.Location.Id, new SelectList(ViewBag.Location, "Id", "Title"), "请选择地点") @Html.DropDownListFor(m => m.JobTitle.Id, new SelectList(ViewBag.JobTitle, "Id", "Title"), "请选择职位") <button type="submit">Find</button> }
之后你可以在控制器里通过ID去查询对应的Title,更符合数据传递的最佳实践。
为什么之前参数是null?
当你提交表单时,浏览器发送的参数是Location.Title=xxx和JobTitle.Title=xxx,但控制器方法参数是answer1和answer2,ASP.NET Core的模型绑定无法将这两个参数映射到不匹配的名称上,所以只能返回null。修正参数名称或使用模型接收后,绑定就能正常工作了。
内容的提问来源于stack exchange,提问作者Mooonah
相关产品推荐
相关产品推荐

