ASP.NET Core Razor页面: 将viewData传递给局部视图

3

假设我想向我的部分视图传递一个产品卡片。我想将产品模型以及一些非模型变量传递到部分视图中,这些变量将基本上只是为了在单个卡片上添加css样式类。我已经通过下面的部分标签助手代码传递了我的产品模型和非模型变量classListisFeaturedisBestSelling

@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>
}

我该如何在局部视图中访问那个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"];
}

是的,我有正确的using语句来使用这个类型。但在构建时仍然出现了这个错误:

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

我尝试直接使用Index PageModel的完整路径,像这样:

Pages.Pages_Index.ViewData["isFeatured"]

然后我收到以下错误:

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

此时,我不确定如何在局部视图中引用变量。


只需为部分视图创建一个新模型,该模型具有部分视图所需的所有属性。然后创建该类的实例,并将其作为模型传递给部分视图。 - Jonathan Alfaro
那是一个有效的解决方法,但是否没有不创建新模型就能实现这一点的方法? - Duke3e33
我不认为这是一种变通方法。针对部分视图使用特定模型是恰当的,也是我认为正确的方式。 - Jonathan Alfaro
你是否尝试过像这样简单地访问视图数据:ViewData["isFeatured"] - Dimitris Maragkos
是的,由于ViewData不在产品模型上,我无法以这种方式访问它。传递到部分视图中的ViewData是Index.PageModel类型(父视图的代码后台)。 - Duke3e33
1个回答

4

ViewData字典与模型无关。

示例:

Index.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" } }' />
}

_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>

我在 Github 上创建了一个小型演示项目,它能够正常工作。


你知道为什么在我的项目中,当我创建一个局部视图时,它会显示上下文中不存在名称为Model的内容吗?非常感谢你的帮助。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接