如何在视图中检查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
相关产品推荐
相关产品推荐

