使用两个viewbag的foreach

问题描述:

我想在视图中使用两个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

尽量避免使用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> 
    } 
} 

看起来好像是你的第二个循环的表达关键字后计算为一个布尔值,而不是一个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