【问题标题】:Do I need a ViewModel to take 1-to-many-data to the view?我是否需要 ViewModel 才能将一对多数据带到视图中?
【发布时间】:2011-02-23 15:37:26
【问题描述】:

这可能是基本的东西,但我在任何地方都找不到明确的答案..

假设我正在使用实体框架 (EF4) 做一个 MVC (3) 应用程序,我有这三个类:

public class Foo
{
    public int FooID
    public Bar Bar
    public ICollection<Baz> Bazes
}

public class Bar
{
    public int BarID
    public string BarText
}

public class Baz
{
    public int BazID
    public Foo Foo
}

将所有 Foo 与相关 Bar's Baz's 一起使用以便我可以循环通过 Foo's 并使用相关项目的最佳方法是什么?我需要制作一个 ViewModel,它应该包含什么?

我想要的结果是这样的

@model = IEnumerable<Foo/FooViewModel>

foreach(var foo in model)
{
  @if(foo.Bar.BarID == 1)
  {
    foreach(var baz in foo)
    {
      @baz.BazID
    }
  }
}

【问题讨论】:

  • 您能否提供更多关于您希望您的视图看起来如何的详细信息。这是一个潜在的递归对象层次结构。
  • 好的,问题更新了,希望更清楚! :)

标签: asp.net entity-framework-4 asp.net-mvc-3


【解决方案1】:

您并不特别需要视图模型。您可以将 EF 对象直接传递给您的视图,在简单的 CRUD 情况下也可以。以我的经验,虽然它从来都不是那么简单的 CRUD。

我通常需要从许多地方获取数据,这些数据并非全部包含在一个对象中。例如,我可能想根据一个人在系统中的角色来显示/隐藏数据。 Foo可能不会知道这一点。另一个示例是带有下拉列表的表单。您需要在某处传递该信息。同样, foo 可能不知道选项应该是什么。

我会为每个类创建一个视图模型,然后使用 AutoMapper 将域模型映射到您的视图模型。

您的视图模型如下所示:

public class FooView{
    public BarView Bar { get; set;}
    public ICollection<BazView> Bazes { get; set;}
}

public class BarView{
    public int BarID { get; set; }
    public BazView Baz { get; set; }
}

public class BazView {
    public int BazID { get; set; }
}

您的操作方法中应该有这样的内容:

var foos = fooRepository.GetFoos();
var model = Mapper.Map<IEnumerable<Foo>,IEnumerable<FooView>>(myFoos);
return View(model);

【讨论】:

  • 感谢您的回答。似乎这个模型比我预期的要大一些,但它似乎是有效的!我对 MVC 的了解越多,它看起来就越像 MVVMC,有人只使用模型视图和控制器吗?再次感谢
  • @Niclas Lindqvist 您可以只使用您的 EF 模型,这对于简单的 CRUD 应用程序通常很好。我的经验是,它永远不会只是 CRUD。我编辑了我的答案,并更详细地说明了我为什么使用视图模型。 HTH
  • @Brian,不,你是对的,它绝不仅仅是 CRUD。我将阅读自动映射等更多内容,但感谢您的所有帮助。
  • @Brian.. BarView 如何包含多个 Baz'es?据我所知,您的视图模型说 BarView 有一个 BazView,但我希望每个 Foo(以及每个 Bar)上有多个 Baze,有什么想法吗?
  • @Niclas Lindqvist 您是否只对在此视图上显示 Baz'es 感兴趣?我以为你不是,因为你将 Foo/Bar 传递给它。不过,在进一步查看问题后,似乎您正在使用 foo/bar 来过滤 baz'es。如果您实际上对显示任何 foo/bar 信息不感兴趣,我会更新答案以向您展示我将如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多