2016-07-27 67 views
1

我正在努力为狗做谱系网站,并且试图弄清楚如何在狗的详细信息页面上显示父母,后代等数据。如何在视图中显示第二个模型的数据?

@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的母亲。有关如何从父母行中提取某些数据的任何提示,例如可能会将姓名显示为父母的详细信息页面的链接?由于

+0

你的狗类应该具有导航属性,从父母到孩子都有1-many。您应该能够在查询中填充这些值,以便它们可用于视图模型。 –

+0

总之,如果您需要多个模型,请制作一个将所有其他模型作为属性的大型模型。在这种情况下,如@TravisJ所描述的那样,创建一个模型来保存对视图中需要的所有子节点的引用。 – Basic

+0

好吧,为了重申您的意思,以确保我的理解,一个潜在的解决方案是制作一个Pedigree类,它是我想要显示的所有Dog对象的集合,并且只有一个单独的视图谱系。 –

回答

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检索。

简而言之:根据需要创建模型,使其充满膨胀,填充相关数据,然后传递给视图。

+0

好吧,我看到这是如何工作的,但是我遇到的问题是如何将相关模型信息传递给视图。我的解决方案是将一个Pedigree类添加到我的DogController中,然后将代码放入我自己的答案中。我想知道它是否遵循了最好的MVC实践,因为我没有创建一个新模型,我只是添加Linq查询来从DogsModel中获取信息。 –

+1

下面是一个建议:创建一个类,它将负责填充您使用的模型 - 类似于“数据层”。你的控制器在这个速率下会变得很大。所以如果你的新DataLayer类有一个GetPedigree(int id)方法,你可以像你这样调用它:'new DataLayer()。GetPedigree(5)'(或者创建它的一个实例,并使用它)。你会很感激你早日分离了这些问题。 – cyrotello

0

所以我增加了一个新的方法,以我的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最佳实践?

+2

考虑到,根据你的问题,你想要狗之间的链接,那么@cyrotello提供的答案比数组更接近内联。如果你正在考虑根据阵列位置在狗之间建立链接,那么请记住,这并不容易理解(即如何知道狗[1]是大坝),而不需要查看阵列是如何构建的。现在你的模型是特定于实现的。模型背后的想法是提供轻松创建和维护视图所需的最少量信息。 –

+0

同意@hubsonbropa;最好将你的模型作为一个单独的类来使用,它可以由你需要的任何字段/属性组成:根据需要列出狗的列表,以及其他辅助属性。 (我也使用'List ',而不是数组。) – cyrotello

相关问题