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

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更安全。
修复方案
  1. 修正控制器购物车查询逻辑:用购物车表存储会话ID/用户ID的字段做过滤,不要拿商品ID匹配会话ID。
  2. 用Url.Content()方法解析~开头的虚拟路径,保证图片路径可正常访问。
  3. 替换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:27:52