首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVC -视图中的多个模型

MVC -视图中的多个模型
EN

Stack Overflow用户
提问于 2013-03-12 11:57:18
回答 2查看 8.4K关注 0票数 4

我第一次在实体框架中使用MVC,数据库优先

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

在我的索引中,我在顶部

代码语言:javascript
运行
复制
@model IEnumerable<Forum6.Models.Forum>

这允许我从数据库中获取表"Forum“中的行。如果我尝试添加一个额外的模型,我在运行时会得到以下错误消息:

第1行:@model IEnumerable第2行:@model 2 IEnumerable解析器错误消息:文件中只允许一条“模型”语句。

在搜索了一个答案之后,我发现:Two models in one view in ASP MVC 3,答案是创建一个包含所有模型(表)的ViewModel (ParentModel)。这是我创建的ViewModel:

代码语言:javascript
运行
复制
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; }
}

我编辑了我的控制器如下所示:

代码语言:javascript
运行
复制
   public class HomeController : Controller
{
    // ForumDBEntities old_db = new ForumDBEntities();

    ViewModel db = new ViewModel();

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

然后将旧索引视图替换为使用ViewModel作为模型的新强类型视图。其中包括:

代码语言:javascript
运行
复制
@model IEnumerable<Forum6.Models.ViewModel>

试图运行它会给我带来以下错误:

传递到字典中的模型项的类型是'Forum6.Models.ViewModel',但是该字典需要一个'System.Collections.Generic.IEnumerable`1Forum6.Models.ViewModel类型的模型项

我如何使"ViewModel“成为可扩展的?还是我的错误在其他地方?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-12 13:44:32

在将@model IEnumerable<Forum6.Models.ViewModel>封装到单个ViewModel中时,需要将IEnumerables更改为ViewModel。

一个好的经验法则是在你的ViewModel和视图之间建立1:1的关系。

这对你来说可能是一个很好的读物:http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/ (如果你不想走那条路,就忽略自动驾驶部分)

您还需要将实际数据放入您的ViewModel中,因为

代码语言:javascript
运行
复制
ViewModel db = new ViewModel();

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

只会给您的视图一个空的ViewModel。一种方法就是。

代码语言:javascript
运行
复制
public ActionResult Index()
{
    var model = new ViewModel
                    {
                        Forum = db.GetForum(),
                        Post = db.GetPost(),
                        Topic = you get the idea
                    };

    return View(model);
}

最后一件事,在命名属性或变量时,通常,当它包含一个列表时,应该使用复数动词。所以你的ViewModel应该是。

代码语言:javascript
运行
复制
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; }
}
票数 10
EN

Stack Overflow用户

发布于 2013-03-12 12:07:25

@model IEnumerable<Forum6.Models.ViewModel>更改为@model Forum6.Models.ViewModel,因为您传递的是ViewModel类的单个实例,而不是它们的集合。

所有集合都在视图模型的单个实例中传递。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15360557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档