ASP.NET Core提交时Address Type与Contact Type出现Null值求助
问题原因
HTML中标记为disabled的表单控件不会被浏览器提交到服务器,因此你的Addresses[i].AddressType和Contacts[i].ContactType字段在提交时无值,导致后端接收为Null。
解决方案
提供两种实用方案,按需选择:
方案1:添加隐藏字段同步值
在每个disabled下拉框旁添加对应hidden输入框,将选中值同步传递给后端:
修改前端RegisterFinal.cshtml代码
地址部分:
<!-- Display Address Information --> @for (int i = 0; i < Model.Addresses.Count; i++) { <div class="row"> <div class="col-md-3 mb-3"> <label class="form-label">Address type</label> <!-- 保留disabled下拉框用于展示 --> <select asp-for="Addresses[i].AddressType" asp-items="@(new SelectList(new List<SelectListItem> { new SelectListItem { Value = "1", Text = "Permanent" }, new SelectListItem { Value = "2", Text = "Present" } }, "Value", "Text", Model.Addresses[i].AddressType))" class="form-select" disabled> </select> <!-- 隐藏字段传递实际值 --> <input type="hidden" asp-for="Addresses[i].AddressType" value="@Model.Addresses[i].AddressType" /> </div> <div class="form-group col-md-3 mb-3"> <label for="houseno">House No:</label> <input asp-for="Addresses[i].HouseNumber" id="houseno" class="form-control" readonly> </div> <div class="form-group col-md-3 mb-3"> <label for="street">Street:</label> <input asp-for="Addresses[i].Street" id="street" class="form-control" readonly> </div> <div class="form-group col-md-3 mb-3"> <label for="barangay">Barangay:</label> <input asp-for="Addresses[i].Barangay" id="barangay" class="form-control" readonly> </div> </div> }
联系方式部分:
<!-- Display Contact Information --> @for (int i = 0; i < Model.Contacts.Count; i++) { <div class="row"> <div class="col-md-6 mb-3"> <label class="form-label">Contact type</label> <!-- 保留disabled下拉框用于展示 --> <select asp-for="Contacts[i].ContactType" asp-items="@(new SelectList(new List<SelectListItem> { new SelectListItem { Value = "1", Text = "Mobile Number" }, new SelectListItem { Value = "2", Text = "Home Number" } }, "Value", "Text", Model.Contacts[i].ContactType))" class="form-select" disabled> </select> <!-- 隐藏字段传递实际值 --> <input type="hidden" asp-for="Contacts[i].ContactType" value="@Model.Contacts[i].ContactType" /> </div> <div class="col-md-6 mb-3"> <label for="contactNumber">Contact Number:</label> <input asp-for="Contacts[i].ContactNumber" id="contactNumber" class="form-control" readonly> </div> </div> }
方案2:后端提交时从TempData重新加载完整数据
若不想修改前端,可在Post方法中直接从TempData重新反序列化获取完整的地址和联系信息,覆盖表单提交的不完整数据:
后端Post方法示例代码
[HttpPost] public IActionResult RegisterFinal(Registration submittedModel) { // 从TempData重新获取完整地址数据 string addressJson = TempData["Address"].ToString(); List<Address> fullAddresses = JsonConvert.DeserializeObject<List<Address>>(addressJson); // 从TempData重新获取完整联系信息数据 string contactJson = TempData["Contact"].ToString(); List<Contact> fullContacts = JsonConvert.DeserializeObject<List<Contact>>(contactJson); // 更新提交模型的完整数据 submittedModel.Addresses = fullAddresses ?? new List<Address>(); submittedModel.Contacts = fullContacts ?? new List<Contact>(); // 执行保存逻辑(示例) // _dbContext.Registrations.Add(submittedModel); // await _dbContext.SaveChangesAsync(); return RedirectToAction("Success"); }
补充提示
- 输入框使用的
readonly属性可正常提交值,仅下拉框的disabled会导致值丢失; - 方案1更直观,前端明确传递所需值;方案2适合无需改动前端的场景,但需注意TempData的默认生命周期(仅可读取一次,若需多次读取需调用
TempData.Keep())。
内容的提问来源于stack exchange,提问作者Erck
相关产品推荐
相关产品推荐

