通过将逻辑和您的视图混合在一起,您正在走下一个滑坡。MVC 旨在减少不同层(模型、视图和控制器)之间的耦合,以使代码更易于维护和测试等。
所以让我们试着清理一下。首先,Total
是一段数据,这意味着它应该是模型的一部分:
public class ContentViewModel
{
public List<User> Users { get; set; }
public int TotalHours
{
get
{
return Users.Sum(u => u.Hours); // Assuming User has an Hours property
}
}
}
然后控制器应该处理模型的创建并为其提供数据。像这样的东西:
public ActionResult Index()
{
ContentViewModel viewModel = new ContentViewModel();
viewModel.Users = db.Users.ToList();
return View(viewModel);
}
现在您有了所需的数据,您可以减少当前在视图中使用的许多逻辑(例如使用 foreach 和Total
var):
@model Reports.ViewModels.ContentViewModel
@Html.DisplayFor(m => m.Users)
<div>Total Hours: @Model.TotalHours</div>
Html.DisplayFor
并Html.EditorFor
使用所谓的显示/编辑器模板,它们会自动为您循环遍历集合,为每个项目呈现一个模板。为了利用这一点ContentViewModel
,您需要创建一个显示模板。为此,您需要在视图所在的位置创建一个文件夹,并将其命名为DisplayTemplates
. 例如,如果您的视图是~/Views/Home/Index.cshtml
,则需要创建文件夹:~/Views/Home/DisplayTemplates
。
右键单击该文件夹以添加新视图。在出现的对话框中,您要创建一个强类型视图,选择您要传递给模板的类型(在我的示例中,User
是类型而不是List<User>
),使其成为局部视图并确保给它与类型同名(再次,User
)。一旦有了模板,就可以像在普通视图中一样使用 HTML 帮助器。像这样的东西:
@model Models.User
@Html.LabelFor(m => m.Name)
@Html.DisplayFor(m => m.Name)
现在,您将事物分解为可管理的块。如果您想了解有关使用显示/编辑器模板的更多信息,我强烈建议您阅读Brad Wilson关于该主题的文章系列。即使它是为 MVC 2 编写的,它仍然适用。