ASP.NET Core中Model非空时Razor视图无法渲染列表数据
问题根因
你碰到的「Model非空但内容不渲染」问题,核心是代码存在逻辑错误,具体问题点如下:
- 核心查询逻辑写反:控制器中过滤当前用户购物车项的条件用了
p.Product.ProductId.Equals(sessionId),拿商品ID和会话ID做匹配,两个值业务上完全无关联,绝大多数场景下查出来的currentCartItem是空列表,最终传给视图的products是元素数量为0的空集合——空集合不等于null,所以你判断Model!=null会返回true,但循环体根本不会执行,自然没有内容输出。 - 路径解析问题:视图里直接拼接
~/images/开头的图片路径,不会被ASP.NET Core自动解析为站点可访问的相对路径,就算循环执行了图片也会加载失败。 - 冗余无效代码:控制器里声明的
CartProductViewModel实例从头到尾没有被使用,属于多余代码。 - 循环写法隐患:
i<=Model.Count()-1的索引判断写法容易引发索引越界异常,遍历引用类型集合优先用foreach更安全。
修复方案
- 修正控制器购物车查询逻辑:用购物车表存储会话ID/用户ID的字段做过滤,不要拿商品ID匹配会话ID。
- 用
Url.Content()方法解析~开头的虚拟路径,保证图片路径可正常访问。 - 替换for循环为foreach遍历,删除冗余代码。
修正后的控制器代码
[HttpGet] public IActionResult Cart() { var sessionId = HttpContext.Session.Id; // 注意:如果你的购物车是关联用户ID,就把下面Where条件里的SessionId换成对应的UserId字段 var currentCartItems = context.cartItems .Where(p => p.SessionId == sessionId) .ToList(); List<Product> products = new List<Product>(); foreach (var item in currentCartItems) { if (item.ProductId == null) { return View("NotFound"); } Product prod = context.products.FirstOrDefault(p => p.ProductId == item.ProductId); if (prod == null) { continue; } products.Add(prod); } return View(products); }
修正后的视图核心代码
@model List<Product> @{ ViewBag.Title = "Cart"; } @foreach(var product in Model) { <p>遍历触发</p> var image = Url.Content("~/images/" + product.product_image_path); <div class="row"> <div class="col"> <div class="row"> <div class="col-md-2"> <img src="@image" alt="No image" class="img-fluid" width="60" asp-append-version="true" /> </div> <div class="col-md-4"> <div class="row"> <div class="col"> <p class="justify-content-md-start">@product.ProductName</p> </div> </div> <div class="row"> <div class="col"> <p>₹@product.Price</p> </div> </div> </div> <div class="col-md-4"> <div class="row"> <div class="col-md-8"> @*数量调整按钮*@ <div class="input-group"> <button type="submit" class="btn btn-light"> - </button> <input type="text" class="form-control" value="@product.Quantity" readonly /> <button type="submit" class="btn btn-light"> + </button> </div> </div> </div> <br /> </div> <div class="col-md-2"> <div class="row"> <div class="col"> <button class="btn btn-danger" type="button" id="button-minus">Remove</button> </div> </div> </div> </div> </div> </div> }
调试提示
可以在控制器return View(products);前打个断点,看products.Count的值,如果是0就说明查询条件还是不对,重点核对购物车表关联会话/用户的字段名是否正确。后续做加减数量、删除商品功能时,记得把对应按钮包在form标签内,否则点击不会提交请求。
内容的提问来源于stack exchange,提问作者Abdullah Khan
相关产品推荐
相关产品推荐

