4

我在实体框架中使用 MVC(第一次),首先是数据库

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

在我的索引中,我在顶部

@model IEnumerable<Forum6.Models.Forum>

这使我可以从我的数据库中的“论坛”表中获取行。如果我尝试添加一个额外的模型,我会在运行时收到以下错误消息:

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

解析器错误消息:文件中只允许使用一个“模型”语句。

搜索答案后,我发现: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”可枚举?还是我的错误在别处?

4

2 回答 2

10

当您将IEnumerables 包装在单个 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; }
}
于 2013-03-12T13:44:32.740 回答
1

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

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

于 2013-03-12T12:07:25.943 回答