2016-07-27 93 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

相關問題