ASP.NET中ViewModel列表回传控制器时为NULL的问题咨询
问题分析与解决方案
Hey there! Let's break down why your List<Case> properties are coming back null when you return the view after hitting a duplicate CaseId error.
根本原因:模型绑定机制限制,和依赖注入无关
ASP.NET MVC的模型绑定只会解析HTTP请求里携带的表单数据来重建你的CaseInputModel对象。你的视图只是通过foreach循环渲染了TopTenList的内容,但这些内容并没有被放在<input>、<select>这类表单控件里——也就是说,用户提交表单时,浏览器根本不会把TopTenList或RegularCaseList的数据发送回服务器,所以这些列表自然就是null。
依赖注入在这里完全不相关:你注入的ApplicationDbContext是用来在控制器里获取数据的工具,和POST请求时的模型绑定流程没有交集。
快速修复方案
既然列表数据本来就来自数据库,我们不需要让客户端回传这些数据,最合理的做法是在POST方法返回视图前,重新加载列表:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(CaseInputModel inputs) { if (DbContext.Cases.Any(m => m.CaseId == inputs.NewCase.CaseId)) { inputs.ErrorMessage = "Error: Case ID already exists"; // 重新初始化需要显示的列表数据 inputs.SetTopTenList(DbContext); // 如果RegularCaseList也需要在视图中展示,同样在这里重新加载 // inputs.RegularCaseList = DbContext.Cases.Where(...).ToList(); return View(inputs); } // 正常创建Case的逻辑... }
额外小提醒:模型验证的潜在问题
我注意到你的Case类里有个可能的错误:
[Required] [RegularExpression("[^0-9]")] public int Id { get; set; }
[RegularExpression("[^0-9]")]要求字段不能包含数字,但Id是int类型——这会导致这个字段永远验证失败,因为int只能是数字。如果这不是你的预期,建议修正或移除这个正则表达式属性。
内容的提问来源于stack exchange,提问作者He Chuan
相关产品推荐
相关产品推荐

