在没有模型的情况下使用超级简单视图引擎遍历列表

Iterating through List with Super Simple View Engine without a model

我正在尝试创建一个简单示例,说明如何使用 NancyFx 的超级简单视图引擎在 .Net Core 上 运行 时迭代使用 ViewBag 发送到前端的字符串列表。但是当我将 List 附加到 @Each 语句时,它只是给出了一个错误。但是,在将列表包装在自定义对象中后,我能够打印它。

public class ViewHolder
{
    public List<string> listOfThings { get; set; }
}
...
ViewHolder boxIt = new ViewHolder();
boxIt.listOfThings = someList;
ViewBag.viewPasser = boxIt;

然后在前端:

@Each.Context.ViewBag.viewPasser.listOfThings
    @Current
@EndEach

这实现了我想要的,但我不明白为什么 @Each 在没有包装器的情况下无法识别我的列表 class。有没有办法不用额外的拳击就可以做到这一点?

您可以通过将您的集合作为模型传递给视图而不是使用 viewbag 来完成您正在寻找的东西。这是一个如何做到这一点的例子:

    in module
    ...
    var items = new List();
    items.Add( "Item1" );
    items.Add( "Item2" );
    items.Add( "Item3" );
    return View["Index", items];


    in view
    ...
    @Each
        @Current
    @EndEach

我深入研究了 NancyFx 源代码并逐句检查了最终导致您所看到的问题的文件。发生的事情是,在该代码中,Nancy 试图将 ViewBag 中的集合转换为 IEnumerable,但失败了。看起来当您将集合直接放入 ViewBag 并且 Nancy 尝试进行转换时,该集合的类型不再是 List 而是动态的,因此转换失败并返回 null 和 Nancy returns [ERR!]。但是,如果您将该列表放入 class 并将该 class 的实例放入 ViewBag 中,它就能够正确协调类型并执行转换。仍然不是很有用,但希望能更深入地了解明显差异的原因。