我是MVC3和C#的新手。
这是我目前的模特
@model Reports.ViewModels.ContentViewModel
<div>Total Hours: </div>
foreach (var user in Model.Users.ToList()) {
@Html.Partial("_DirectReports", user)
}
这很好用,然后我在这些局部视图中使用HTML,使用另一个@model呈现我想要的一切。 问题是我想将所有数据加在一起。
我想在foreach之外创建一个var foreach将数据插入var并在foreach完成之后将其返回
@model Reports.ViewModels.ContentViewModel
@{var Total = 0}
foreach (var user in Model.Users.ToList()) {
@Html.Partial("_DirectReports", user)
//@Total is assigned a value in the partial view
}
<div>Total Hours: @Total</div>
如果这可能会很棒
答案 0 :(得分:5)
通过将逻辑和你的观点混合在一起,你会在这里滑下一个滑坡。 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>
),make它是一个局部视图,并确保给它与类型相同的名称(再次,User
)。获得模板后,您可以像在普通视图中一样使用HTML帮助程序。像这样:
@model Models.User
@Html.LabelFor(m => m.Name)
@Html.DisplayFor(m => m.Name)
现在你把事情分解成可管理的块。如果您想了解有关使用显示/编辑器模板的更多信息,我强烈建议您阅读有关该主题的Brad Wilson's article series。即使它是为MVC 2编写的,它仍然适用。
答案 1 :(得分:2)
我担心你是在混合MVC模式中的职责。这就是你为此奋斗的原因。您应该使用视图模型。这不是您的观点应该处理的事情。因此,只需在Total
视图模型上定义ContentViewModel
属性,让控制器操作为其分配值。然后:
@model Reports.ViewModels.ContentViewModel
foreach (var user in Model.Users.ToList()) {
@Html.Partial("_DirectReports", user)
}
<div>Total Hours: @Model.Total</div>
在ASP.NET MVC中,视图不负责计算任何内容。视图的职责是仅以视图模型的形式显示为其准备的数据。
答案 2 :(得分:2)
这是你想要的。
@model Reports.ViewModels.ContentViewModel
@{
int Total = 0;
foreach (var user in Model.Users.ToList()) {
@Html.Partial("_DirectReports", user)
//@Total is assigned a value in the partial view
Total = 5;
}
<div>Total Hours: @Total</div>
}
会给:总小时数:5