【问题标题】:How do you display data from a second model in a view?如何在视图中显示来自第二个模型的数据?
【发布时间】:2016-07-27 23:17:16
【问题描述】:

我正在尝试为狗做一个谱系网站,我正在尝试弄清楚如何在狗的详细信息页面上显示父母、后代等的数据。

@model DogPedigree.Entities.Dog

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>Dog</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.AKCRegNumber)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.AKCRegNumber)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.name)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.name)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.sex)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.sex)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.breed)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.breed)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.birthday)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.birthday)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.sirenumber)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.sirenumber)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.damnumber)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.damnumber)
        </dd>

    </dl>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.AKCRegNumber }) |
    @Html.ActionLink("Back to List", "Index")
</p>

所以 model.AKCRegNumber 是我的主键,sirenumber 是父亲的 AKCRegNumber,damnumber 是母亲的 AKCRegNumber。关于如何从父母行中提取一些数据的任何提示,比如可能将名称显示为父母详细信息页面的链接?谢谢

【问题讨论】:

  • 您的狗类应该具有从父级到子级的 1-many 导航属性。您应该能够在查询中填充这些值,以便它们可用于视图模型。
  • 简而言之,如果您需要多个模型,请制作一个具有所有其他模型作为属性的大型模型。在这种情况下,如@TravisJ 所述,创建一个模型,其中包含对视图中所需的所有子节点的引用。
  • 好的,重申一下你所说的以确保我理解,一个潜在的解决方案是创建一个 Pedigree 类,它是我想要显示的所有 Dog 对象的集合并且只对 Pedigree 有一个单独的视图。
  • 是的谱系课程。虽然实际上这只是一个 Dog 类(或者如果 Dam 和 Sire 不是 Dog 的一部分,则可能是 Dog 的派生类),但您包含了 Sire 和 Dam 导航属性,而这些属性也被包含在内,因此您可以沿着家谱向上走只要你需要。现在您看到的更多是树状视图。

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-5


【解决方案1】:

您需要一个范围更广的模型:

using DogPedigree.Entities

public class DogModel
{
    public Dog CurrentDog { get; set; }
    public Dog FatherDog { get; set; }
    public Dog MotherDog { get; set; }
    // other properties you need...
}

在您将 DogModel 发送到视图之前,用您需要的任何数据(例如来自数据库)填充它。

您还可以将Title 的属性添加到此模型...

public string Title { get; set; }

...而不是从 ViewBag 设置和检索。

简而言之:根据需要创建可扩展的模型,用相关数据填充它,然后传递给视图。

【讨论】:

  • 好的,我知道它是如何工作的,但我遇到的一个问题是如何将相关的模型信息传递给视图。我的解决方案是在我的 DogController 中添加一个 Pedigree 类,我会将代码放入我自己的答案中。我想知道它是否遵循最佳 MVC 实践,因为我没有创建新模型,我只是添加了 Linq 查询以从 DogsModel 中提取信息。
  • 这里有一个建议:创建一个负责填充您使用的模型的类——类似于“数据层”之类的东西。以这种速度,您的控制器将变得非常大。因此,如果您的新 DataLayer 类有一个 GetPedigree(int id) 方法,您可以像这样从控制器调用它:new DataLayer().GetPedigree(5)(或者可能创建它的一个实例并使用它)。你会很感激你早早把这些顾虑分开。
【解决方案2】:

所以我向我的 DogsController 添加了一个新方法:

public async Task<IActionResult> Pedigree(int id)
    {
        var dog = await _context.Dogs.SingleOrDefaultAsync(m => m.ID == id);
        var dam = await _context.Dogs.SingleOrDefaultAsync(m => m.Name == dog.Dam);
        var sire = await _context.Dogs.SingleOrDefaultAsync(m => m.Name == dog.Sire);
        var damDam = await _context.Dogs.SingleOrDefaultAsync(m => m.Name == dam.Dam);
        var damSire = await _context.Dogs.SingleOrDefaultAsync(m => m.Name == dam.Sire);
        var sireDam = await _context.Dogs.SingleOrDefaultAsync(m => m.Name == sire.Dam);
        var sireSire = await _context.Dogs.SingleOrDefaultAsync(m => m.Name == sire.Sire);
        Dogs[] dogs = new Dogs[7] { dog, dam, sire, damDam, damSire, sireDam, sireSire };
        return View(dogs.ToList());
    }

而且效果很好。我想知道这是否符合 MVC 最佳实践?

【讨论】:

  • 考虑到,根据您的问题,您想要狗之间的链接,那么@cyrotello 提供的答案比数组更内联。如果您正在考虑根据数组位置在狗之间创建链接,那么请记住,如果不查看数组是如何构造的,这不容易阅读(即如何知道狗 [1] 是大坝)。现在您的模型是特定于实现的。模型背后的理念是提供轻松创建和维护视图所需的最少信息。
  • 同意@hubsonbropa;最好将您的模型作为一个单独的类,它可以由您需要的任何字段/属性组成:狗列表以及其他辅助属性(根据需要)。 (我也会使用List&lt;Dog&gt;,而不是数组。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多