2011-08-25 22 views
0

我有以下型號:幫助顯示主從數據到MVC3視圖

public class Page 
    { 
     public int PageID { get; set; } 
     public string Name { get; set; } 
     public string Content { get; set; } 
     public DateTime? DateCreated { get; set; } 
     public bool IsPublished { get; set; } 
     public string ModifiedBy { get; set; } 
     public DateTime? DateModified { get; set; } 

     public int UserID { get; set; } 
     public int CategoryID { get; set; } 

     public virtual User User { get; set; } 
     public virtual Category Category { get; set; } 
    } 

public class Category 
    { 
     public int CategoryID { get; set; } 

     [Required(ErrorMessage = "Category name is required.")] 
     [Display(Name = "Category Name")] 
     public string Name { get; set; } 

     public virtual ICollection<Page> Pages { get; set; } 

    } 

,我想填充這個導航列表:

<div id="centeredmenu" class="nav-border nav-color"> 
    <ul> 
    @foreach (var pages in Model) 
    { 
     <li>CATEGORY NAME GOES HERE 
      <ul> 
       @foreach (var pages in Model) 
       { 
       <li>PAGE NAMES GO HERE</li> 
       } 
      </ul> 
     </li> 
    } 
    </ul> 
</div> 

但我實現控制器有問題。我想這個視圖模型:

public class MainPageModels 
    { 
     public Category Categories { get; set; } 
     public Page Pages { get; set; } 
    } 

,但它只是讓我感到困惑,甚至更多與此錯誤消息:

System.Data.Edm.EdmEntityType:的EntityType「MainPageModels」沒有定義鍵。定義此EntityType的關鍵字。 System.Data.Edm.EdmEntitySet:EntityType:EntitySet「MainModels」基於沒有定義鍵的類型「MainPageModels」。

這是我的控制器:

public ActionResult Index() 
     { 
      var pages = db.MainModels.Select(p => p.Pages).Select(c => c.Category); 
      return View(pages); 
     } 

我可能會丟失在這裏簡單的東西。

+0

從你的帖子看來,你已經指定了一個MainModels類型的EntitySet,如果你想這樣做,你需要指定一個somesort的鍵或id。 –

+0

MainModel類中的一個鍵?我一直在瀏覽SO中的幾個線程,只能看到他們在主模型中聲明模型類。我是mvc3 noob。 – Ron

+0

MVC中通常使用2種類型,模型通常指從數據庫獲取數據的對象,或者它可能是您的域模型。 那麼你還有一個ViewModel,這是你的視圖將消耗。 您已經定義了一個實體數據模型,即查看您如何訪問MainModels,它是通過DbContext。這意味着實體框架期望此對象具有定義的鍵。對於ViewModels,通常不存在數據庫關係。 –

回答

1

在這裏我的解決方案,我的父母 - 子女名單問題:

我創建一個視圖模型,以容納我的兩個類別和網頁:

public class HomeViewModels 
    { 
     [Key] 
     public int HomeViewKey { get; set; } //This is a MUST! 
     public IEnumerable<Category> ViewCategories { get; set; } 
     public IEnumerable<Page> ViewPages { get; set; } 

     public void CreateHomeViewModel(IEnumerable<Category> categories, 
             IEnumerable<Page> pages) 
     { 
      this.ViewCategories = categories; 
      this.ViewPages = pages; 
     }   
    } 

然後編輯我的控制器來填充視圖模型:

public ActionResult Index() 
     { 
      HomeViewModels homePages = new HomeViewModels(); 
      homePages.CreateHomeViewModel(db.Categories.ToList(), 
              db.Pages.ToList()); 
      return View(homePages); 
     } 

終於創造了UL麗與以下列表:

@{var hvCategories = Model.ViewCategories;} 
@foreach (var categories in hvCategories) 
    { 
     <li>@Html.ActionLink(categories.Name, "Index", "Home") 
      <ul> 
       @{var hvPages = Model.ViewPages 
           .Where(p => p.CategoryID == categories.CategoryID);} 
       @foreach (var pages in hvPages) 
       { 
        <li>@Html.ActionLink(pages.Name, "Index", "Home")</li> 
       } 
      </ul> 
    </li> 

我希望這可以幫助任何計劃使用ap構建嵌套列表的人arent-child模型。這花了我兩天的時間才弄清楚。乾杯!

2

張貼這在這裏的代碼/語法

public class Person 
{ 
    [Key] 
    public int PersonID { get; set; } 
    public string Name { get; set; } 
    public string LastName { get; set; } 
} 
public class DataContext : DbContext 
{ 
    EntitySet<Person> Persons { get; set; } 
} 

您的視圖模型,然後可以做以下

public class PersonAddViewModel 
{ 
    public string Name { get; set; } 
    public string LastName { get; set; } 

    public void CreateViewModelFromDataModel(Person person) 
    { 
     this.Name = person.Name; 
     this.LastName = person.LastName ; 
    } 
} 

這僅僅是一個例子,是想說明一個數據模型之間的差異,一個查看模型 您的觀點然後是PersonAddViewModel的強類型視圖

+0

謝謝你。如何使用具有一對多關係的兩個數據模型的ViewModel像人訂單一樣? – Ron

+0

我終於得到了我的名單,使用一些你的想法。將發佈我的答案。 – Ron