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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:23:16