ASP.NET MVC如何将列表模型视图的select选中值传递到控制器
问题根因
- 表单仅提交了
ParticipantId单个字段,ASP.NET Core 模型绑定无法自动根据单个ID填充完整的Participant对象 - 直接调用
Console.WriteLine(自定义类对象)时,默认执行基类Object的ToString()方法,输出内容为类的全限定名,不是绑定失败 - 接收基础类型参数返回默认值/空值,是因为参数名和表单字段的
name属性不匹配,模型绑定找不到对应字段就会赋值默认值
解决方案(保持ViewModel使用规范)
方案1:调整参数名直接接收ID(推荐,性能最优)
控制器参数名和表单select的name属性完全保持一致为ParticipantId,拿到ID后再从数据库查询完整的Participant对象即可:
[HttpPost] [Route("/Dashboard/postNewBasketballPlayer")] public IActionResult PostNewBasketballPlayer2(int ParticipantId) { // 此处可输出正确的选中ID Console.WriteLine(ParticipantId); // 查询得到完整ViewModel对象 ViewModel.Participant newParticipant = 你的数据库上下文.Participants.FirstOrDefault(p => p.ParticipantId == ParticipantId); // 后续业务逻辑 return RedirectToAction("Dashboard","Dashboard"); }
方案2:直接接收Participant对象
修改前端select的name属性,匹配参数的层级结构即可,参数名是newParticipant,所以字段名要改为newParticipant.ParticipantId:
cshtml修改:
<select name="newParticipant.ParticipantId"> <!-- 原有option逻辑不变 --> </select>
控制器调整输出逻辑,输出具体属性值,或者给Participant类重写ToString()方法:
// 方式1:直接输出属性 Console.WriteLine(newParticipant.ParticipantId); // 方式2:给Participant类重写ToString()方法,后续可直接输出对象 public class Participant { public int ParticipantId { get; set; } public string ParticipantFirstName { get; set; } public string ParticipantLastName { get; set; } public override string ToString() { return $"{ParticipantFirstName} {ParticipantLastName} 编号:{ParticipantId}"; } }
验证方法
提交表单时打开浏览器F12控制台的「网络」标签,查看请求的Form Data中是否存在ParticipantId=选中值,确认前端提交正常后再排查后端绑定逻辑即可。
内容的提问来源于stack exchange,提问作者jgrewal
相关产品推荐
相关产品推荐

