有一个大脑屁...给这个模型:
public class Result
{
public decimal Cost {get;set;}
}
这种极端简化的观点:
@{
decimal resultsTotal = 0;
}
<div>@resultsTotal</div> //need the total from the loop below here
@foreach(var result in Model.Results)
{
resultsTotal += result.Cost;
<div>@result.Cost</div>
}
我需要在foreach循环上显示<{1}}变量以上。我意识到我可以resultsTotal
在视图,模型或控制器中,重点是我想要以避免多次枚举@Model.Results.Sum(x => x.Cost)
。是否有缓冲结果并在循环后更新div或许或?是的,我也可以使用Results
,但那闻起来。
答案 0 :(得分:1)
@{
IEnumerable<Result> results = Model.Results;
@foreach(var result in Model=)
{
<div>@result.Cost</div>
}
var resultsTotal = Model.Results.Sum(x => x.Cost)
}
<div>@resultsTotal</div>
@{}
是一个可用于执行代码的代码块。我不建议这样做,因为在视图中放置逻辑就是肮脏的。
您应该在控制器的操作方法中进行此计算,并通过模型将其传递给您的视图。
有些事情......
public ActionResult Index()
{
// ... get your results from wherever you got them from before, eg your service ...
IEnumerable<Result> results = myService.GetResults();
decimal resultsTotal = 0;
var responseModel = new YourViewModel
{
Results = results,
ResultsTotal = results.Sum(x => x.Cost)
};
return View(responseModel);
}
然后您可以使用最少量的逻辑显示已在控制器中已经计算的信息:
@foreach(var result in Model.Results)
{
<div>@result.Cost</div>
}
<div>@Model.ResultsTotal</div>
答案 1 :(得分:1)
您可以使用helper
并将结果写入缓冲区:
@{
IEnumerable<Result> results = Model.Results;
decimal resultsTotal = 0;
var buffer = new List<HelperResult>();
}
@foreach(var result in Model)
{
resultsTotal += result.Cost;
buffer.Add(ResultRow(result))
}
<div>@resultsTotal</div>
@foreach (var result in buffer)
{
@result
}
@helper ResultRow(Result result)
{
<div>@result.Cost</div>
}
答案 2 :(得分:1)
将逻辑移出视图并进入视图模型。不幸的是,你还没有弄清楚你想要做什么类型的计算,但是,一般来说,只需在视图模型上添加返回这些计算结果的属性,如果需要,你可以链接它们。 。例如:
public class MyAwesomeViewModel
{
public List<Result> Results { get; set; }
public decimal Total
{
get { return Results.Sum(x => x.TotalCost);
}
public decimal AverageCost
{
get { return Total / Results.Count(); }
}
}
public class ResultViewModel
{
public decimal TotalCost
{
get { return Cost + Tax + Shipping; }
}
}
就像你的例子一样,我刚刚在这里编写了一些东西来说明这一点。将计算分解为谨慎单位,然后重新构建它们。这不仅简化了计算,还可以在需要时访问组件计算。然后,您可以保持视图相对逻辑自由。