ASP.NET Core MVC中SelectList绑定后CaseTypeId始终为NULL问题排查
ASP.NET Core MVC中提交LegalCase时CaseTypeId始终为NULL的问题排查
在ASP.NET Core MVC项目中创建LegalCase记录时,页面下拉框选择CaseType后提交,后台接收的CaseTypeId始终为NULL。以下是相关代码及排查结论:
模型类
public class CaseType { [Key] public int CaseTypeId { get; set; } [Required] public string CaseTypeCode { get; set; } [Required] public string CaseTypeName { get; set; } public string? CaseTypeDescription { get; set; } public bool IsActive { get; set; } = true; } public class LegalCase { [Key] public Guid LegalCaseId { get; set; } public string LegalCaseNumber { get; set; } // auto-generate number public string LegalCaseDescription { get; set; } [ForeignKey("CaseType")] public int? CaseTypeId { get; set; } public virtual CaseType? CaseType { get; set; } }
控制器代码
public IActionResult Create() { var items = _context.CaseTypes .Select(item => new SelectListItem { Value = item.CaseTypeId.ToString(), Text = item.CaseTypeName }) .ToList(); items.Insert(0, new SelectListItem { Value = null, Text = "-- Select --" }); var selectList = new SelectList(items, "Value", "Text"); ViewBag.CaseTypeId = selectList; return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("LegalCaseId,LegalCaseNumber,LegalCaseDescription")] LegalCase legalCase) { if (!ModelState.IsValid) { foreach (var key in ModelState.Keys) { var state = ModelState[key]; if (state.ValidationState == ModelValidationState.Invalid) { var errorMessages = state.Errors.Select(e => e.ErrorMessage); var errorMessage = string.Join(" | ", errorMessages); Log.Error($"ModelState error for property {key}: {errorMessage}"); } } } if (ModelState.IsValid) { legalCase.LegalCaseId = Guid.NewGuid(); int caseTypeId; if (Int32.TryParse(Request.Form["CaseTypeId"], out caseTypeId)) { legalCase.CaseTypeId = caseTypeId; } _context.Add(legalCase); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } var items = _context.CaseTypes .Select(item => new SelectListItem { Value = item.CaseTypeId.ToString(), Text = item.CaseTypeName }) .ToList(); items.Insert(0, new SelectListItem { Value = null, Text = "-- Select --" }); var selectList = new SelectList(items, "Value", "Text", legalCase.CaseTypeId); ViewBag.CaseTypeId = selectList; return View(legalCase); }
视图代码
<form asp-action="Create"> <div class="row mb-3"> <div class="col-sm-3"> <h4 class="card-title text-warning">Legal Case</h4> <p class="card-text">Add New Case</p> <input type="submit" class="btn btn-primary btn-sm" value="Save" style="margin-bottom:15px;" /> <a asp-action="Index" class="btn btn-secondary btn-sm" style="margin-bottom:15px;">Close</a> </div> <div class="col-lg-9"> <table class="table table-sm"> <tbody> <tr> <td class="bg-light" style="vertical-align:middle;">Case Number</td> <td> <input asp-for="LegalCaseNumber" class="form-control form-control-sm" /> <span asp-validation-for="LegalCaseNumber" class="text-danger small"></span> </td> </tr> <tr> <td class="bg-light" style="vertical-align:super;" width="25%">Description</td> <td> <input asp-for="LegalCaseDescription" class="form-control form-control-sm" maxlength="100" id="LegalCaseDescription" /> <small id="smallCaseDescription" style="font-size:x-small"></small> <span asp-validation-for="LegalCaseDescription" class="text-danger small"></span> </td> </tr> <tr> <td class="bg-light" style="vertical-align:middle;">Case Type</td> <td> <select asp-for="CaseTypeId" class="form-control form-control-sm" asp-items="ViewBag.CaseTypeId"> </select> </td> </tr> </tbody> </table> </div> </div> </form>
问题修复点
- Bind特性遗漏字段:Post方法的
[Bind]属性未包含CaseTypeId,导致模型绑定无法自动填充该字段。修改Bind参数为:[Bind("LegalCaseId,LegalCaseNumber,LegalCaseDescription,CaseTypeId")] - 默认选项值优化:下拉框默认选项的
Value = null会导致提交时字段值为空字符串,建议改为Value = "",避免模型绑定解析异常 - 移除冗余解析逻辑:修复Bind配置后,无需手动从
Request.Form中解析CaseTypeId,模型绑定会自动完成该操作
内容的提问来源于stack exchange,提问作者Haminteu
相关产品推荐
相关产品推荐

