【问题标题】:MVC - Multiple models in a viewMVC - 视图中的多个模型
【发布时间】:2013-02-27 22:14:09
【问题描述】:

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

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

在我的索引中,我在顶部

@model IEnumerable<Forum6.Models.Forum>

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

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

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

搜索答案后,我发现: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);
    }
}

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

@model IEnumerable<Forum6.Models.ViewModel>

尝试运行它会给我这个错误:

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

如何使“ViewModel”可枚举?还是我的错误在别处?

【问题讨论】:

  • 将 ViewModel 作为模型传递给您的视图:@model ViewModel
  • 抱歉,忘记包含我的视图包含的内容。编辑了我的答案以包括在内。 "@model IEnumerable"
  • 从我看到的情况来看,你确定你的视图模型应该是 IEnumerable 吗?由于里面的所有物品都是,就像你第一次尝试一样。
  • 我从 ViewModel 中删除了“IEnumrable”,但仍然遇到同样的错误。我想我必须让控制器传递一个 Enumerable ViewModel,但我还没有弄清楚。
  • 如何合并视图模型中的模型?你能发布那个代码吗

标签: asp.net-mvc entity-framework


【解决方案1】:

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

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

【讨论】:

  • 也许应该反过来?我应该将 ViewModel 的集合传递给 View。如果我不这样做,我将无法运行“@foreach(模型中的变量项){...}”
  • 不,这样是正确的。一种视图模型,其中可以包含一些集合。
【解决方案2】:

您需要将 @model IEnumerable&lt;Forum6.Models.ViewModel&gt; 更改为 @model Forum6.Models.ViewModel,因为您将 IEnumerables 包装在单个 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 中创建方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多