我第一次在实体框架中使用MVC,数据库优先
我想要做的是在一个视图中显示数据库中的数据。我首先创建了数据库,然后根据包含所有表的数据库创建了一个ADO.NET实体数据模型。然后,我创建了一个索引视图,它是以实体数据模型作为模型进行强类型的。
在我的索引中,我在顶部
@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:
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);
}
}然后将旧索引视图替换为使用ViewModel作为模型的新强类型视图。其中包括:
@model IEnumerable<Forum6.Models.ViewModel>试图运行它会给我带来以下错误:
传递到字典中的模型项的类型是'Forum6.Models.ViewModel',但是该字典需要一个'System.Collections.Generic.IEnumerable`1Forum6.Models.ViewModel类型的模型项
我如何使"ViewModel“成为可扩展的?还是我的错误在其他地方?
发布于 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中,因为
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; }
}发布于 2013-03-12 12:07:25
将@model IEnumerable<Forum6.Models.ViewModel>更改为@model Forum6.Models.ViewModel,因为您传递的是ViewModel类的单个实例,而不是它们的集合。
所有集合都在视图模型的单个实例中传递。
https://stackoverflow.com/questions/15360557
复制相似问题