ASP.NET Core MVC Razor视图访问Model.Count遍历模型报错排查
问题根因
报错和Model.Count == 0判断逻辑无关,核心原因是视图声明的强类型模型和实际传入的模型类型不匹配:
- 你写的带列表渲染逻辑的Razor视图,顶部声明
@model List<Treino1.Models.Despesa>,要求传入Despesa对象的集合 - 但
NovaDespesa的POST处理方法中,添加新支出后执行return View("DespesaConfirmada", despesa),传入的是单个Despesa实体,不是列表。此时视图执行到Model.Count时,Model根本不是List类型,不存在Count属性,直接触发运行时异常。
另外你的代码存在视图归属混淆:从Index action返回List<Despesa>的逻辑看,带空状态判断、foreach循环渲染列表的Razor代码,本来就应该放在Index视图里,而不是提交成功的DespesaConfirmada视图中。
修复步骤
1. 修正POST提交后的跳转逻辑
按照Web开发通用的PRG(Post-重定向-Get)模式,提交表单成功后不要直接返回视图,重定向到Index列表页,既解决模型类型不匹配问题,也能避免用户刷新页面重复提交表单:
[HttpPost] public IActionResult NovaDespesa(Despesa despesa) { if (ModelState.IsValid) { RepositorioDespesas.AddDespesa(despesa); // 重定向到Index action,自动从仓储取全量支出数据传给列表视图 return RedirectToAction(nameof(Index)); } return View(); }
2. 把列表渲染代码放到Index视图
将你之前写的空状态判断、foreach循环的Razor代码,移动到Views/Despesas/Index.cshtml文件中,这部分代码逻辑本身没有问题,只要传入正确的List<Despesa>类型就能正常运行:
@{ ViewData["Title"] = "Lista de Despesas"; } @model List<Treino1.Models.Despesa> @if (Model.Count == 0) { <h1>Sem Despesas...</h1> } else { <h1>Despesas!</h1> @foreach (Treino1.Models.Despesa d in Model) { <div class="card bg-secondary border-dark"> <div class="card-body"> <b>Nome da Despesa: </b> @d.NomeDespesa <b>Quantidade: </b> @d.Quantidade <b>Valor: </b> @d.Valor <b>Categoria: </b> @d.Categoria <b>Pago? </b> @if (d.Pago) { @:Sim } else { @:Não } </div> </div> } } <div> <a asp-action="NovaDespesa">Nova Despesa</a> </div>
3. (可选)单独编写提交成功页
如果需要保留支出提交成功的提示页面,单独新建Views/Despesas/DespesaConfirmada.cshtml,绑定单个Despesa模型即可,不要在这个视图里写列表相关逻辑:
@{ ViewData["Title"] = "Despesa Confirmada"; } @model Treino1.Models.Despesa <h1>Cadastro concluído!</h1> <p>A despesa @Model.NomeDespesa foi registrada com sucesso.</p> <a asp-action="Index">Voltar para a lista de despesas</a>
如果不需要单独的成功提示,直接用第一步的重定向逻辑即可,提交后会自动跳转到支出列表,能看到刚新增的数据。
补充提示
你当前用的静态仓储类仅适合本地开发调试,应用重启、IIS回收进程后存储的所有支出数据都会丢失,正式环境建议替换为数据库持久化存储。
内容的提问来源于stack exchange,提问作者Crej00
相关产品推荐
相关产品推荐

