2013-03-13 58 views
1

我想在視圖中使用兩個viewbag做foreach,但在第二個foreach中出現錯誤。使用兩個viewbag的foreach

@foreach (var item in ViewBag.stages) 
{ 
     <div id="style101"> 
     <h2><span> <strong>@item.NameStage</strong></span></h2> 
     </div> 
    foreach (var item2 in (ViewBag.actions.IdStage == item.IdStage)) 

我該怎麼做?

+1

你在ViewBag中傳遞了什麼數據。應該有更好的方法來做到這一點。 – Shyju 2013-03-13 14:26:00

回答

3

儘量避免使用ViewBag/ViewData將數據從您的操作方法傳遞到視圖。你現在一定意識到這使你的觀點有點骯髒。 使用強類型的視圖模型。

假設你的觀點是創造一些東西。因此,爲此創建一個視圖模型。假設你在每個階段都有多個操作。

public class CreateSomeThingVM 
{ 
    public string Title { set;get;} 
    public List<Stage> Stages { set;get;} 

    public CreateSomeThingVM() 
    { 
    Stages=new List<Stage>(); 
    } 
} 
public class Stage 
{ 
    public int ID { set;get;} 
    public string StageName { set;get;} 
    public List<Action> Actions { set;get;} 
    public Stage() 
    { 
    Actions =new List<Action>(); 
    } 
} 
public class Action 
{ 
    public int ID { set;get;} 
    public string ActionName { set;get;} 
} 

而在你的Action方法中,獲取數據並設置屬性。

public ActionResult Create() 
{ 
    var vm=new CreateSomeThingVM(); 

    vm.Stages=GetListOfStagesFromSomeWhereWithItsActions(); 

    return View(vm); 
} 

Assumuing GetListOfStagesFromSomeWhereWithItsActions方法返回Stage對象影響其正常Actions列表。(如需要得到每個階段的有關行動應該在這裏做你的過濾)。

現在,在您查看哪些是強類型我們CreateSomeThingVM視圖模型,寫一些乾淨的代碼

@model CreateSomeThingVM 

@foreach(var stage in Model.Stages) 
{ 
    <h2>@stage.StageName</h2> 
    foreach(var action in Model.Actions) 
    { 
    <p>@action.ActionName</p> 
    } 
} 
1

看起來好像是你的第二個循環的表達關鍵字後計算爲一個布爾值,而不是一個IEnumerable。 你的意思是使用.where()來過濾一個枚舉嗎?
也許:

Viewbag.actions.where(a => a.IdStage == item.IdStage) 
+0

我正在使用它並且不起作用:( – kalu 2013-03-13 15:22:25

+0

我收到此錯誤:不能將lambda表達式用作動態分派操作的參數,而無需先將其轉換爲委託或表達式樹類型 – kalu 2013-03-13 16:07:26

+0

您需要將actions屬性((kalusTypeForAction)Viewbag.action).where(...)將其包含的具體類型轉換爲IEnumerable的擴展。 – 2013-03-13 19:02:44