在MVC中将视图模型用于db上下文的位置

时间:2017-04-15 08:12:48

标签: c# asp.net-mvc linq razor viewmodel

Controller不应直接使用DB上下文,并且存储库不应该知道视图模型(表示)。

基本问题当然是避免从数据库中选择所有列,只选择那些需要的列。

这个问题通常是如何解决的?

示例1:控制器中的DB上下文:

public ActionResult Products()
{         
   var model = from p in _context.Products 
   select new ProductItemViewModel
   {
           ProductName = p.ProductName
   };
   return View(model);        
}

示例2:存储库中的ViewModel:

public ProductItemViewModel Products()
{         
  return  from p in _context.Products 
    select new ProductItemViewModel
    {
       ProductName = p.ProductName
    };
}

2 个答案:

答案 0 :(得分:1)

你真的不应该在你的控制器中有DbContext。 MVC是一种表示模式。通常,访问数据存储(DBContext是)不是表示层的关注点。

阅读MVC Orchestrator classes, as explained by Dino Esposito

Orchestrator类有点像MVC应用程序的服务层。 Orchestrator 知道(但不一定理解)您的MVC中的表示模型(“M”),以及您的存储库的模型接受或退货。 Dino的Orchestrator类的主要目的是从Controller类中删除应用程序逻辑,并使它们易于测试和重用。您的控制器仅负责与Web相关的进程(例如,确保请求已通过身份验证,或从HTTP上下文获取信息,或重定向请求或编写HTTP响应)。

您还可以拥有在您的演示文稿和存储库模型之间实例化和映射的Factory类。例如,ProductFactory知道如何在给定ProductFromRepo对象的情况下创建ProductViewModel对象(假设创建ProductViewModel对象所需的所有信息都可从ProductFromRepo对象获得),和/或反之亦然。这些Factory类的唯一目的是将模型映射与Orchestrator和存储库分离。

更新: 要回答您的评论,您的存储库的设计取决于您。通常人们认为它应该返回数据库模型。但是您的回购可能会返回DTO甚至是域模型。这实际上取决于您如何设计回购和应用程序架构。

答案 1 :(得分:0)

根据我的知识和想法,你必须阅读更多有关MVC的内容。这就是我的想法。

MVC中的(M)是表示数据的模型,但它表示可以在View Side表示的来自DB或其他外部资源方的数据。现在的问题是View需要显示数据,有时需要显示来自多个Model的数据,以便ViewModel进入图片。

因此,通常来说,ViewModel表示需要通过视图显示的数据。这里ViewModel没有任何其他责任,因此它是被动模型。

ViewModel仅在Web端可用。它不应暴露或与BLL或其他层共享。