4

我是 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>

如果这是可能的,那就太好了

4

3 回答 3

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 和Totalvar):

@model Reports.ViewModels.ContentViewModel

@Html.DisplayFor(m => m.Users)

<div>Total Hours: @Model.TotalHours</div>

Html.DisplayForHtml.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 编写的,它仍然适用。

于 2012-08-08T18:49:01.350 回答
4

恐怕您正在混合 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 中,计算任何东西不是视图的责任。视图的职责是仅以视图模型的形式显示为其准备的数据。

于 2012-08-08T18:21:23.110 回答
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

于 2012-08-08T18:22:04.103 回答