2017-05-08 116 views
1

有腦屁......給這個模型: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> 
} 

我需要顯示resultsTotal變量以上 foreach循環。我意識到我可以在視圖中,@Model.Results.Sum(x => x.Cost),模型或控制器,點是我,以避免多次列舉Results。是否有緩衝結果和循環後可能或更新div?是的,我也可以使用jquery,但這有味道。

回答

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> 
} 
+0

這個工程雖然不是使用'HelperResult',我只是嘗試追加一個快速' StringBuilder「,然後是」Html.Raw「它。只枚舉一次結果。 – mxmissile

+0

對於這麼簡單的事情,這真的不是正確的做法。爲了讓模型進入可以在視圖中顯示的狀態,而不必在視圖中進行計算,我會強烈建議您執行任何您需要執行的操作。是否有數據不能循環多次的原因?祝你好運,我的朋友:) – Luke

+0

@Luke yea我知道(性能)要求並不理想,但它就是這樣。實際上,我將所有內容都移到了Command中,並將生成的html表存儲在'StringBuilder'中,作爲我的視圖中輸出模型的一部分。 – mxmissile

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> 
+0

對不起,我不清楚,'resultsTotal' div需要顯示在foreeach循環之上。 – mxmissile

+0

我可以,它仍然會循環兩次,一次在Sum方法中,並且一次在視圖中,如果可能只做一次,我更願意。 – mxmissile

+0

沒有真正的另一種方法來做到這一點,沒有做一些非常糟糕的事情,比如首先輸出for循環到一個字符串(如何?),然後在輸出'resultsTotal'值後輸出到頁面... – Luke

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

就像你的例子,我剛剛在這裏做了一些東西來說明這一點。把你的計算分解成謹慎的單位,然後再建立起來。這不僅簡化了計算,而且還使您可以訪問組件計算,如果需要它們。然後,你可以保持你的視圖相對邏輯自由。

+0

對不起克里斯,我想我的問題遇到了錯誤,我不關心計算和它們發生的位置,我*關心多次循環遍歷結果。 LINQ Sum和Count方法遍歷結果(幕後)。 – mxmissile

+0

LINQ很快,但無論如何,沒有辦法做到你想要的。如果您需要在for循環之前顯示總數,則必須迭代兩次。 –