2013-10-14 177 views
0

我在观察模型时遇到了一些麻烦,它倾向于引导我误入歧途,并在查看它自身并因此进行意大利面代码计算,或者我回退ViewBag。我听到的两种方法都是错误的。MVC查看模型

我真的只使用MVC的数据库,所以我所有的网站都有一个.EDMX作为他们的模型。下面的代码返回一个IEnumerable Orders列表,它可以正常工作,但我应该如何合计总和,以便我可以将它们显示在列表的末尾?目前我在View中的foreach语句中这样做。

public ActionResult SalesAll() 
{ 
    var orderproductvariants = db.OrderProductVariants.Include("Order") 
     .Include("ProductVariant") 
     .Include("ProductVariant.Product") 
     .Where(x => x.Order.PaidDateUtc != null) 
     .OrderByDescending(x => x.PriceInclTax); 

    return View(orderproductvariants.ToList()); 
} 

回答

6

我建议对于每一个观点,即要求任何类型的数据创建一个视图模型。

在这种情况下,我想创建:

public class SalesAllViewModel 
{ 
    IEnumerable<OrderProductVariant> _orderProductVariant; 

    public SalesAllViewModel(IEnumerable<OrderProductVariant> orderProductVariant) 
    { 
    this._orderProductVariant = orderProductVariant; 
    } 
} 

现在,如果你需要基于传递到View值逻辑,在模型中进行更改。

public int SumOfSomethingInOrderProductVariant(int id) 
    { 
    return this._orderProductVariant 
     .Where(opv.ID == id) 
     .Sum(opv => opv.IntValue); 
    } 

这意味着视图中所有数据的逻辑是一致的。如果您有多个区域在视图中使用某种逻辑显示相同的值,那么很容易忘记,并且必须复制并粘贴(yeeesh)其他值。

使用ViewBag或ViewData通常会被忽视,因为没有人可以告诉控制器或视图中真正发生了什么,所有的魔法都隐藏在View(Bag/Data)中。

更新1

请阅读Model–view–controller details

一个ViewModel(在MVC的技术描述中只是模型)有没有什么与数据访问有关。它只是一个POCO,与实体框架或Oracle或XML或任何其他数据存储/检索技术无关。 ViewModel背后的目标之一是将视图与数据源分离。

现在更困惑了,是代码优先的方法,即没有良好的数据库?

此问题与ViewModels无关。这也是Subjective question,所以没有很好的理由来回答它。

随着我使用我似乎没有数据库需要所有的包括(“订单”)的

既然你提到一个EDMX文件,我可以假设你在谈论实体框架。你如何使用实体框架取决于你。如果出于性能方面的原因需要包含,那么请执行此操作,如果您不需要它提供的数据,请不要使用它。无论哪种方式,它不关心如何在MVC中使用ViewModel。

+0

嗨,我喜欢你的话,这可能只是我在找什么,但在我的情况下,它仍然有点模糊,关于我的问题。你能告诉我更多的代码吗? – Bojangles

+0

现在更困惑了,是一种代码第一种方法,即没有良好的数据库?我现在不知道!有了我使用的数据库,我似乎并不需要所有包含(“订单”)的 – Bojangles

+0

我不知道为什么你感到困惑。但我用更多的信息更新了我的问题。 –