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

ASP.NET Core Razor Pages:局部视图中访问传递的ViewData方法

ASP.NET Core Razor Pages局部视图访问传递变量的正确方式

你已经通过partial标签助手将product模型和ViewData变量(classList、isFeatured、isBestSelling)传递给了_ProductCardPartial局部视图,但错误地尝试实例化页面模型或直接引用静态路径访问ViewData导致报错。以下是正确的解决方法:


方法一:直接访问局部视图的ViewData对象

局部视图本身自带ViewData上下文,无需实例化原页面模型或引用静态路径,直接从ViewData中取值即可,注意类型转换要匹配:

@{
    // 从ViewData中获取传递的变量,确保类型转换正确
    bool isFeatured = (bool)ViewData["isFeatured"];
    bool isBestSelling = (bool)ViewData["isBestSelling"];
    List<string> classList = (List<string>)ViewData["classList"];
    // 局部视图的模型是Product,直接用Model访问产品数据
    var product = Model;
}

<!-- 在视图中使用变量示例 -->
<div class="@string.Join(" ", classList)">
    @if (isFeatured)
    {
        <span class="badge bg-secondary">精选</span>
    }
    @if (isBestSelling)
    {
        <span class="badge bg-success">畅销</span>
    }
    <h5>@product.Name</h5>
    <p>@product.Price</p>
</div>

为什么之前的方法错误?

  • 手动实例化Index页面模型:页面模型需要由ASP.NET Core框架初始化,手动new的实例没有绑定请求上下文和ViewData,会触发非静态成员访问报错。
  • 直接引用Pages.Pages_Index.ViewData:ViewData是页面实例的非静态属性,必须通过框架创建的实例访问,无法通过静态类直接调用。

方法二:使用强类型ViewModel(更推荐)

为了避免ViewData的类型转换风险,可创建包含所有需要传递数据的ViewModel,实现类型安全:

1. 定义ViewModel类

public class ProductCardViewModel
{
    public Product Product { get; set; }
    public bool IsFeatured { get; set; }
    public bool IsBestSelling { get; set; }
    public List<string> ClassList { get; set; }
}

2. 主页面传递ViewModel

@for (var i = 0; i < 24; i++) 
{
    var classList = new List<string>();
    var isFeatured = i == 0;
    var isBestSelling = i == 1 || i == 2;

    if (isFeatured)
    {
        classList.Add("border");
        classList.Add("border-secondary");
    } 
    else if (isBestSelling) 
    {
        classList.Add("border");
        classList.Add("border-success");
    }

    var product = Model.Products[i];
    var cardViewModel = new ProductCardViewModel
    {
        Product = product,
        IsFeatured = isFeatured,
        IsBestSelling = isBestSelling,
        ClassList = classList
    };

    <div class="col-12 col-tablet-6 col-laptop-4 col-desktop-3 my-3">
        <partial name="_ProductCardPartial" model="cardViewModel"/>
    </div>
}

3. 局部视图使用强类型模型

@model ProductCardViewModel

<div class="@string.Join(" ", Model.ClassList)">
    @if (Model.IsFeatured)
    {
        <span class="badge bg-secondary">精选</span>
    }
    @if (Model.IsBestSelling)
    {
        <span class="badge bg-success">畅销</span>
    }
    <h5>@Model.Product.Name</h5>
    <p>@Model.Product.Price</p>
</div>

这种方式无需类型转换,代码可读性和安全性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:17:02