【发布时间】:2017-08-09 14:33:46
【问题描述】:
我有一个 Razor 视图,它遍历视图模型上的集合属性,以及该集合上单个项目的显示模板。在该单个项目中,然后我再次执行相同的操作,因此在引擎盖下我有嵌套循环,可以在页面上多次呈现相同类型的实例。
在叶子类型的显示模板中,我想知道有多少类似的项目已经被渲染到页面上。
我尝试向 ViewBag 添加一个属性并在每次迭代时递增它,但这不起作用。
型号
public class FooViewModel
{
public IEnumerable<Bar> Bars { get; set; }
}
public class BarViewModel
{
public IEnumerable<Baz> Bazes { get; set; } // how do you pluralize baz?
}
public class BazViewModel
{
}
索引.cshtml
@model FooViewModel
@{
ViewBag.RenderCount = 0;
}
@Html.DisplayFor(m => m.Bars);
DisplayTemplates/BarViewModel.cshtml
@model BarViewModel
@Html.DisplayFor(m => m.Bazes);
DisplayTemplates/BazViewModel.cshtml
@model BazViewModel
// how many BazViewModels have been rendered before this one?
@ViewBag.RenderCount // is 0 every time
@{
ViewBag.RenderCount++;
}
【问题讨论】:
-
我并没有真正关注您的问题,但所有处理都应在控制器内部完成。尽量避免将逻辑放在视图中。看起来您需要一个带有递增计数器的视图模型。每个视图都有自己的 Viewbag 实例,因此您不能将其用作全局变量(我认为您正在尝试这样做)。
-
所以在控制器中完成所有处理,然后只为您的视图提供要呈现的数据,然后您根本不需要共享数据
-
@Liam 谢谢;这可能是解决此问题的更好方法。
-
我自己注意到,有一个重载版本
DisplayFor<TModel, TValue>(HtmlHelper<TModel>, Expression<Func<TModel, TValue>>, Object)和here 是使用示例。 -
你可以在控制器中使用
int num = model.Bars.SelectMany(x => x.Bazes).Count();来获取总数,但是如果你想在视图代码中显示递增的值,那么你需要嵌套for循环
标签: asp.net-mvc razor