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

如何在视图中检查ViewModel的IEnumerable列表是否为空?代码排查

视图中判断IEnumerable列表为空的问题及解决方法

问题描述

我想确认是否可以在视图中检查从控制器通过ViewModel传递的IEnumerable列表是否为空,还是只能在控制器中编写判断条件。目前我的代码中的else条件无法正常显示,希望能得到相关指导。

控制器代码

[Area("User")]
[Authorize]
public class TrayController : Controller
{
    private readonly IUnitOfWork _unitOfWork;
    
    public OfferTrayVM OfferTrayVM { get; set; }

    public TrayController(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public IActionResult Index()
    {
        var claimsIdentity = (ClaimsIdentity)User.Identity;
        var claim = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier);

        OfferTrayVM = new OfferTrayVM()
        {
            ListOfferTray = _unitOfWork.OfferTray.GetAll(u => u.ApplicationUserId == claim.Value,
            includeProperties: "Trade")
        };
        
        return View(OfferTrayVM);
    }

    public IActionResult Delete(int trayId)
    {
        var tray = _unitOfWork.OfferTray.GetFirstOrDefault(u => u.Id == trayId);
        _unitOfWork.OfferTray.Remove(tray);
        _unitOfWork.Save();

        return RedirectToAction("Index", "Home", new { area = "User" });
    }
}

视图模型代码

public class OfferTrayVM
{
    public IEnumerable<OfferTray> ListOfferTray { get; set; }
}

视图代码

@model QPQ.Models.ViewModels.OfferTrayVM

<form method="post">
<br />
<div class="container">
    <div class="card">
        <div class="card-header bg-dark text-light ml-0">
            <div class="row">
                <div class="col-6  pt-2">
                    Summary Confirmation
                </div>
                <div class="col-6 text-end">
                    
                </div>
            </div>
        </div>
        @if(Model.ListOfferTray != null)
        {
            <div class="card-body">
                @foreach (var item in Model.ListOfferTray)
                {
                    <div class="row">

                        <div class="col-12 col-lg-4 pt-md-3">
                            <h5><strong>@item.Trade.CompanyName - Have offered to trade: </strong></h5>
                            <p><small>@item.Trade.Description</small></p>
                            <hr>
                            <h5><strong>@item.Trade.CompanyName - Have requested in Return: </strong></h5>
                            <p><small>item.Trade.InReturnFor</small></p>
                        </div>
                        <div class="col-12 col-lg-4 pt-md-3">
                            <h5><strong>You are Offering in return:</strong></h5>
                            <p><small>@item.OfferInReturn</small></p>
                        </div>
                        <div class="col-12 col-lg-4 text-center row">
                            <div class="col-sm-4 text-right pt-2">
                                <a asp-action="Delete" asp-route-trayId="@item.Id" class="btn btn-danger">
                                    <i class="bi bi-trash-fill">Delete</i>
                                </a>
                            </div>
                        </div>
                    </div>
                    <hr />
                }
            </div>
        }
        else 
        {
            <div class="card-body">
            <h3>You do not have any existing offers. Please click<a asp-action="index" asp-area="Home">here</a>to continue.</h3>
            </div>
        }

        <div class="card-footer">
            <div class="card-footer row">
                <div class="col-sm-12 col-lg-4 col-md-6 offset-lg-8 offset-md-6 ">
                    <a class="btn btn-success form-control">Summary</a>
                </div>
            </div>
        </div>
    </div>
</div>
</form>

解决方案

1. 核心问题分析

你的else条件不显示,是因为_unitOfWork.OfferTray.GetAll()方法返回的通常是空集合(而非null)。此时Model.ListOfferTray != null始终为true,导致else分支永远不会执行。

2. 视图中修改判断逻辑

直接在视图中同时检查null和集合是否有元素,把判断条件改成:

@if(Model.ListOfferTray?.Any() == true)

?.是空传播运算符,避免null引发异常;Any()用于判断集合是否包含元素。

3. (可选)控制器中提前处理null

为了让视图逻辑更简洁,可以在控制器初始化ViewModel时,把null替换为空集合:

OfferTrayVM = new OfferTrayVM()
{
    ListOfferTray = _unitOfWork.OfferTray.GetAll(u => u.ApplicationUserId == claim.Value, includeProperties: "Trade") 
                    ?? Enumerable.Empty<OfferTray>()
};

这样视图中可以直接写@if(Model.ListOfferTray.Any()),无需再判断null。

4. 修复视图中的小错误

视图里的<p><small>item.Trade.InReturnFor</small></p>缺少@符号,会直接显示文本而非变量值,应修改为:

<p><small>@item.Trade.InReturnFor</small></p>

5. 判断逻辑的选择

  • 视图中判断:更灵活,适合直接在界面层处理空状态展示。
  • 控制器中判断:可以提前处理空状态,比如跳转或返回特定视图,让视图只负责渲染已有数据。

两种方式都可行,根据场景选择即可。

内容的提问来源于stack exchange,提问作者Paul M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:46:18