剃刀查看流程

时间:2017-05-08 16:15:36

标签: asp.net-mvc razor

有一个大脑屁...给这个模型:

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,但那闻起来。

3 个答案:

答案 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; }
    }
}

就像你的例子一样,我刚刚在这里编写了一些东西来说明这一点。将计算分解为谨慎单位,然后重新构建它们。这不仅简化了计算,还可以在需要时访问组件计算。然后,您可以保持视图相对逻辑自由。