MVC - 视图中的多个模型

NoC*_*lue 4 asp.net-mvc entity-framework

我正在使用MVC(第一次)使用Entity框架,数据库优先

我想要做的是在单个视图中显示数据库中的数据.我首先创建了数据库,然后根据包含所有表的数据库创建了一个ADO.NET实体数据模型.然后我创建了一个使用我的实体数据模型作为模型强类型的索引视图.

在我的索引中,我有顶部

@model IEnumerable<Forum6.Models.Forum>
Run Code Online (Sandbox Code Playgroud)

这允许我从我的数据库中获取表"论坛"中的行.如果我尝试添加额外的模型,我得到运行时收到此错误消息:

Line 1: @model IEnumerable<Forum6.Models.Forum>
Line 2: @model2 IEnumerable<Forum6.Models.Post>  
Run Code Online (Sandbox Code Playgroud)

分析器错误消息:文件中只允许一个"模型"语句.

在找到答案之后我发现了这个: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; }
}
Run Code Online (Sandbox Code Playgroud)

我编辑我的控制器看起来像这样:

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

    ViewModel db = new ViewModel();

    public ActionResult Index()
    {
        return View(db);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用ViewModel作为模型的新强类型视图替换旧的Index视图.其中包含:

@model IEnumerable<Forum6.Models.ViewModel>
Run Code Online (Sandbox Code Playgroud)

试图运行这个给我这个错误:

传递到字典中的模型项的类型为'Forum6.Models.ViewModel',但此字典需要类型为'System.Collections.Generic.IEnumerable`1 [Forum6.Models.ViewModel]的模型项

如何让"ViewModel"变得强大?或者我的错误在其他地方?

Snæ*_*ørn 10

你需要改变@model IEnumerable<Forum6.Models.ViewModel>,以@model Forum6.Models.ViewModel作为你包裹单一视图模型里面你IEnumerables.

一个好的经验法则是在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);
}
Run Code Online (Sandbox Code Playgroud)

只会给你的视图一个空的ViewModel.一种方法是.

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

    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

在命名属性或变量时,最后一件事是在包含列表时应使用复数动词.所以你的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; }
}
Run Code Online (Sandbox Code Playgroud)