如何使用Mustache渲染对象集合?

时间:2011-06-21 13:04:35

标签: c# asp.net mustache

我正在尝试使用Nustache,以便我可以在ASP.Net Web应用程序中共享后端和前端代码之间的渲染模板。当我将一个对象传递给一个模板时,它工作正常,但我无法弄清楚如何让它渲染一个集合。所以,如果我有这样的模板:

{{#RenderItems}}
  <th data-warning="{{WarningLevel}}" data-limit="{{LimitLevel}}">{{TotalHours}}</th>
{{/RenderItems}}

然后我想传入一组对象并获取一组th元素。

我尝试过的事情:

  • 创建包含属性WarningLevelLimitLevelTotalHours的类,将对象添加到List并直接传递:Nustache.Core.Render.FileToString(System.Web.HttpContext.Current.Server.MapPath("my.template"), ListOfObjects)
  • 做同样的事情,除了创建一个匿名类:Nustache.Core.Render.FileToString(System.Web.HttpContext.Current.Server.MapPath("my.template"), new { RenderItems = ListOfObjects})
  • 使用包含相同对象的Dictionary
  • 而不是列表
  • 使用词典词典 - 因此每个项目本身就是一个具有上述属性
  • 的词典

它呈现任何东西的唯一方法是,如果我使用匿名类,但我不能让它用我所做的命名项填充模板。我确定我在这里遗漏了一些相当明显的东西,因为我认为这应该是直截了当的,但文档中说“查看代码和测试”但我无法确定哪个测试实际上是在处理这种情况。有人可以指出我正确的方向,或提供一些示例代码吗?

1 个答案:

答案 0 :(得分:8)

我能够使用以下类和控制器操作:

public class Person {
    public string Name { get; set; }
    public string Email { get; set; }
}

public ActionResult Index() {
    var people = new List<Person>() { 
        new Person { Name = "Albert Adams", Email = "albert@email.com" },
        new Person { Name = "Bob Becker", Email = "bob@email.com" },
        new Person { Name = "Charles Charles", Email = "charles@email.com" }
    };

    ViewData["People"] = people;

    ViewResult viewResult = View();
    viewResult.ViewEngineCollection = new ViewEngineCollection { new NustacheViewEngine() };

    return viewResult;
}

然后是Index.nustache:

{{#People}}
    <p>{{Name}} - {{Email}}</p>
{{/People}}

请注意,我今天早上从Nustache回购中提取了最新的更改。