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

Out*_*ast 2 c# partial-views razor asp.net-mvc-3

我是MVC3和C#的新手.

这是我目前的模特

@model Reports.ViewModels.ContentViewModel
<div>Total Hours: </div>

foreach (var user in Model.Users.ToList()) {
   @Html.Partial("_DirectReports", user)
}
Run Code Online (Sandbox Code Playgroud)

这工作得很好,然后我在这些局部视图中使用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>
Run Code Online (Sandbox Code Playgroud)

如果这是可能的那将是伟大的thks

Joh*_*n H 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,控制器应该处理模型的创建并为其提供数据.像这样的东西:

public ActionResult Index()
{
    ContentViewModel viewModel = new ContentViewModel();
    viewModel.Users = db.Users.ToList();

    return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)

既然您拥有了所需的数据,那么您可以减少视图中当前使用的许多逻辑(例如使用foreach和Totalvar):

@model Reports.ViewModels.ContentViewModel

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

<div>Total Hours: @Model.TotalHours</div>
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

现在你把事情分解成可管理的块.如果您想了解有关使用显示/编辑器模板的更多信息,我强烈建议阅读Brad Wilson关于该主题的文章系列.即使它是为MVC 2编写的,它仍然适用.