【问题标题】:Is there a way to share data between instances of razor display templates?有没有办法在剃刀显示模板的实例之间共享数据?
【发布时间】: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&lt;TModel, TValue&gt;(HtmlHelper&lt;TModel&gt;, Expression&lt;Func&lt;TModel, TValue&gt;&gt;, Object) 和here 是使用示例。
  • 你可以在控制器中使用int num = model.Bars.SelectMany(x =&gt; x.Bazes).Count();来获取总数,但是如果你想在视图代码中显示递增的值,那么你需要嵌套for循环

标签: asp.net-mvc razor


【解决方案1】:

正如Liam 在 cmets 中所建议的那样,我最终将这个处理移到了控制器中(或者,实际上,移到了从我的数据实体到视图模型的映射中)。这需要在我需要计数的视图模型中添加一个属性,并将该属性设置为映射过程的一部分。

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 2017-05-06
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2016-11-03
    • 2017-09-11
    • 2013-03-12
    相关资源
    最近更新 更多