使用两个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))
我该怎么做?
答
尽量避免使用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)
你在ViewBag中传递了什么数据。应该有更好的方法来做到这一点。 – Shyju 2013-03-13 14:26:00