You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:02:03