ASP.net MVC3实体,不知道怎么算

时间:2012-03-24 11:24:05

标签: asp.net asp.net-mvc linq entity-framework

我有2个表,1个有国家,1个有州。 states表中有一个包含Population的列。

我正在使用实体,我已经为国家/地区创建了状态列表

public class TblCountries
{
//Entities for my table country
...
public List<tblStates> States { get; set; }
}

所以现在我可以列举属于某个国家的所有州。

现在我想要做的就是统计人口数量,这样我就可以显示整个国家的人口数量。

我尝试在我的视图中使用

@foreach (var item in Model.Countries) {
 @Html.DisplayFor(modelItem => item.States.Count<population>)
}

但这不起作用,有人知道怎么做吗?

先谢谢!

2 个答案:

答案 0 :(得分:1)

你不应该在视图中嵌入任何逻辑。在MVC中编程时,您的控制器应该为视图提供必要的数据。视图的作用是仅显示数据,它与计数/枚举/添加/删除等无关。

所以,对于你的特殊问题,我会这样做。首先,创建一个包含国家及其人口的ViewModel。然后在控制器操作中填充该viewmodel(这里是所有与数据库的连接,计数和实例化)。之后,您传递该视图模型以查看和编写如下内容:

@foreach (var item in Model.CountriesPopulations)
{
    @Html.DisplayFor(modelItem => item.Value)
}

其中CountriesPopulations可能是Dictionary(包含国家/地区名称和人口数)。

答案 1 :(得分:1)

您需要使用Linq Sum Function

我没有检查过这段代码,但它会是这样的:

@foreach (var item in Model.Countries) {
 var states = item.states;
 states.Select(state => state.population).Sum()
}

Dmitriy关于将逻辑保持在中间层的观点是合理的建议;然而,这些线条在.NET MVC和视图模型模式中变得模糊(这导致了纯粹主义者之间的许多抱怨)。

我的建议是,如果您可以在控制器后面的类中隔离逻辑,那么就这样做。如果对于给定视图不可能,则可以随意向视图添加逻辑。毕竟,这就是语法的用途。

您可能需要执行此操作的时间示例是,如果您将通用视图模型传递给许多视图,但在某些视图中需要进行一些特定的逻辑调整。

祝你好运!