【问题标题】:asp.net mvc - pass partial data model to partial viewasp.net mvc - 将部分数据模型传递给部分视图
【发布时间】:2012-02-02 05:38:48
【问题描述】:

我希望构建一个获取模型列并打印它的局部视图。 类似的东西:

在视图中:

@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 一词,它是列名。我不想在部分视图中硬编码“品牌”这个词,而是我喜欢列名会在那里。
  3. 在局部视图中我需要输入@model products_comparison.Models.Product,但我没有 想送孔表。我只想发送一列 - 但我不知道该放什么..

谢谢!

编辑:

只是为了清除一件事,我希望视图将为表中的每一列(无论如何对于表中的大多数列)调用相同的局部视图,并且每次我都会发送不同的列(不同的值确切地说是列)。

【问题讨论】:

    标签: asp.net-mvc razor partial-views ado.net-entity-data-model


    【解决方案1】:

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

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

    另外请澄清 2 和 3,因为他们不清楚你想要什么

    【讨论】:

    • @Nir 如果您“接受”对您有帮助的答案,通常会很有帮助。 (请,谢谢。)
    【解决方案2】:

    首先重构并将正确的逻辑放在正确的位置。这个 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>
    

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

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

    【讨论】:

    • 谢谢。我对您的回答的问题是视图地址指向品牌列而不是列。我希望视图将为表中的每一列(对于表中的大多数列)调用相同的部分视图。因此,我没有只将品牌传递给视图,而是发送孔表。
    • @nir,在这种情况下,您可以调整视图模型,使其包含表格的列和行。
    • 那么它与模型本身有何不同?
    • @nir,这将取决于您希望如何在视图上呈现信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多