ASP.NET MVC - 将部分数据模型传递给部分视图

8
我希望构建一个部分视图,获取模型列并将其打印出来。 类似这样:
在视图中:
@model IEnumerable<products_comparison.Models.Product>
@{
ViewBag.Title = "Index";

var Brand = (from r in Model
             select r.Brand).Distinct();
}
<h2>
Index</h2>

@Html.RenderPartial("_DisplayAttribute",Brand)

在部分视图中:
<table>
    <tr>
        <th>
            Brand
        </th>
    </tr>
    @foreach (var row in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(r => row)
            </td>
        </tr>
    }
</table>

我遇到了一些问题:
  1. 编译器不允许我将 Barnd 发送到部分视图。
  2. 如果您查看部分视图代码,您会看到单词 Brand,这是列名称。我不希望在部分视图中硬编码单词“Brand”,而是希望该列名称在那里。
  3. 在部分视图中,我需要放置 @model products_comparison.Models.Product,但我不想发送整个表格。我只想发送一个列 - 但我不知道应该放什么..
谢谢!
编辑:
只为澄清一件事,我希望视图为表中的每个列调用相同的部分视图(对于表中的大多数列),并且每次我都会发送不同的列(确切地说是不同值列)。
2个回答

12

首先进行重构并将正确的逻辑放置在正确的位置。这个LINQ查询在视图中完全没有作用。 视图不应该执行任何LINQ查询或其他操作来获取数据。视图应该使用视图模型形式从控制器动作下传递的数据进行操作。 控制器动作构建并传递一个适合视图的视图模型,你需要为视图定义。

因此,像往常一样,您需要定义一个视图模型,以满足您的视图要求:

public class MyViewModel
{
    public IEnumerable<Brand> Brands { get; set; } 
}

然后,您需要编写一个控制器操作,以填充此视图模型并将其传递给视图:

public ActionResult Foo()
{
    IEnumerable<products_comparison.Models.Product> products = ...
    var model = new MyViewModel
    {
        Brands = (from r in Model select r.Brand).Distinct()
    };
    return View(model);
}

然后是一个视图:

@model MyViewModel
<table>
    <tr>
        <th>
            Brand
        </th>
    </tr>
    @Html.DisplayFor(x => x.Brands)
</table>

最后,您可以定义相应的显示模板,该模板将自动呈现视图模型的Brands集合中的每个元素(~/Views/Shared/DisplayTemplates/Brand.cshtml):

@model Brand
<tr>
    <td>
        @Html.DisplayForModel()
    </td>
</tr>

谢谢。我对你的回答有问题,因为视图地址指向品牌列而不是某一列... 我希望视图能够为表中的每一列调用相同的部分视图(对于表中的大多数列)。因此,我没有仅传递品牌到视图,而是发送了整个表格。 - Nir
@nir,在这种情况下,您可以调整您的视图模型,使其包含表格的列和行。 - Darin Dimitrov
那么它与模型本身有什么不同? - Nir
@nir,这将取决于您希望如何在视图上呈现信息。 - Darin Dimitrov

7

对于第1个尝试,将@Html.RenderPartial("_DisplayAttribute",Brand)更改为@Html.Partial("_DisplayAttribute",Brand)

您还需要在局部视图中指定模型,例如@model products_comparison.Models.Brand或类似的内容

另外,请澄清第2和第3点,因为它们不太清楚您想要什么


@Nir 如果您接受了帮助您的答案,那通常会很有帮助。(谢谢您。) - Scott Fraley

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