从剃刀视图中的foreach局部视图获取数据

时间:2012-08-08 18:18:55

标签: c# asp.net-mvc-3 razor partial-views

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

如果这可能会很棒

3 个答案:

答案 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.DisplayForHtml.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