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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:48:15