ASP.NET Core Razor Pages,将 viewData 传递给部分视图

Duk*_*e33 3 c# .net-core razor-pages

假设我想将一张product卡片传递给我的部分视图。我想将product模型以及一些非模型变量传递到局部视图中,这些变量基本上只是添加用于css在各个卡片上设置样式的类。我已经通过下面的部分标签帮助程序代码传递了我的产品模型和非模型变量classList, isFeatured, 和isBestSelling

@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];

    <div class="col-12 col-tablet-6 col-laptop-4 col-desktop-3 my-3">
        <partial name="_ProductCardPartial" model="product" view-data='new ViewDataDictionary(ViewData){ { "isBestSelling", isBestSelling }, { "isFeatured", isFeatured }, { "classList", classList } }'/>
    </div>
}
Run Code Online (Sandbox Code Playgroud)

我如何ViewData在部分上访问它,因为它的模型不是包含的索引页ViewData,并且我不会将其作为其模型传递。我查看了Microsoft Docs中的示例。他们只是使用ViewData他们传递到部分视图的新字典没有问题,这对我不起作用。

我尝试在部分中初始化该Index类型的新实例(它保存PageModel并继承ViewData)并从视图数据中设置变量,如下所示:

@{
    var data = new Index();
    bool isFeatured = (bool)data.ViewData["isFeatured"];
    bool classList = (bool)data.ViewData["classList"];
    bool isBestSelling = (bool)data.ViewData["isBestSelling"];
}
Run Code Online (Sandbox Code Playgroud)

是的,我有正确的 using 语句来使用这种类型。仍然构建时出现此错误

错误 CS0120:非静态字段、方法或属性“RazorPageBase.WriteLiteral(object?) 需要对象引用”

我尝试只使用 Index PageModel 的整个路径,如下所示:

Pages.Pages_Index.ViewData["isFeatured"]
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

非静态字段、方法或属性“Pages_Index.ViewData”需要对象引用

此时我不确定如何引用局部视图内的变量。

Dim*_*kos 5

ViewData字典与模型无关。

例子:

索引.cshtml

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

@foreach(var product in Model.Products)
{
    <partial name="_ProductPartial"
             model="product"
             view-data='@new ViewDataDictionary(ViewData) { { "Param1", "abc" }, { "Param2", "def" } }' />
}
Run Code Online (Sandbox Code Playgroud)

_ProductPartial.cshtml

@model Product

<div class="card">
    <div class="card-body">

        <p>@ViewData["Param1"]</p>
        <p>@ViewData["Param2"]</p>

        <p>@Model.Id</p>
        <p>@Model.Name</p>

    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我在github上创建了一个小型演示项目。它按预期工作。