簡體   English   中英

MVC-視圖中的多個模型

[英]MVC - Multiple models in a view

我第一次使用MVC和Entity Framework,首先使用Database

我要做的是在單個視圖中顯示數據庫中的數據。 首先創建數據庫,然后從包含所有表的數據庫中創建一個ADO.NET實體數據模型。 然后,我創建了一個索引視圖,該視圖使用實體數據模型作為模型進行了強類型化。

在我的索引中,我位於頂部

@model IEnumerable<Forum6.Models.Forum>

這使我可以從數據庫中的“論壇”表中獲取行。 如果嘗試添加額外的模型,則會在運行時收到以下錯誤消息:

 Line 1: @model IEnumerable<Forum6.Models.Forum> Line 2: @model2 IEnumerable<Forum6.Models.Post> 

解析器錯誤消息:文件中僅允許一個'model'語句。

搜索答案后,我發現了這一點: 在ASP MVC 3一個視圖中有兩個模型答案是創建一個包含所有模型(表)的ViewModel(ParentModel)。 這是我創建的ViewModel:

public class ViewModel
{
    public IEnumerable<Forum6.Models.Forum>         Forum       { get; set; }
    public IEnumerable<Forum6.Models.Post>          Post        { get; set; }
    public IEnumerable<Forum6.Models.Topics>        Topics      { get; set; }
    public IEnumerable<Forum6.Models.Users>         Users       { get; set; }
    public IEnumerable<Forum6.Models.PrivMsg>       PrivMsg     { get; set; }
    public IEnumerable<Forum6.Models.Permission>    Permission  { get; set; }
}

我編輯了控制器,使其看起來像這樣:

   public class HomeController : Controller
{
    // ForumDBEntities old_db = new ForumDBEntities();

    ViewModel db = new ViewModel();

    public ActionResult Index()
    {
        return View(db);
    }
}

然后將舊的Index視圖替換為使用ViewModel作為模型的新的強類型視圖。 其中包含:

@model IEnumerable<Forum6.Models.ViewModel>

嘗試運行此操作會給我這個錯誤:

傳遞到詞典中的模型項的類型為'Forum6.Models.ViewModel',但是此詞典需要模型類型為'System.Collections.Generic.IEnumerable`1 [Forum6.Models.ViewModel]

如何使“ ViewModel”可枚舉? 還是我的錯誤在其他地方?

在將@model IEnumerable<Forum6.Models.ViewModel>包裝在單個ViewModel中時,需要將@model IEnumerable<Forum6.Models.ViewModel>更改為@model Forum6.Models.ViewModel

一個好的經驗法則是在ViewModel和View之間建立1:1關系。 在此處輸入圖片說明

這可能對您來說是一本好書: http : //lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/ (如果不想,請忽略自動映射器部分走那條路)

您還需要在ViewModel中放入實際數據,因為

ViewModel db = new ViewModel();

public ActionResult Index()
{
    return View(db);
}

只會給您的視圖一個空的ViewModel。 一種方法是。

public ActionResult Index()
{
    var model = new ViewModel
                    {
                        Forum = db.GetForum(),
                        Post = db.GetPost(),
                        Topic = you get the idea
                    };

    return View(model);
}

通常,在命名屬性或變量時,最后一件事是當包含列表時應使用復數動詞。 因此,您的ViewModel將會是。

public class ViewModel
{
    public IEnumerable<Forum6.Models.Forum>         Forums      { get; set; }
    public IEnumerable<Forum6.Models.Post>          Posts       { get; set; }
    public IEnumerable<Forum6.Models.Topics>        Topics      { get; set; }
    public IEnumerable<Forum6.Models.Users>         Users       { get; set; }
    public IEnumerable<Forum6.Models.PrivMsg>       PrivMsgs    { get; set; }
    public IEnumerable<Forum6.Models.Permission>    Permissions { get; set; }
}

當您傳遞ViewModel類的單個實例而不是它們的集合時,請將@model IEnumerable<Forum6.Models.ViewModel>更改為@model Forum6.Models.ViewModel

您的所有集合都在視圖模型的單個實例中傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM