Antaris RazorEngine - Helper Lambda表达式

时间:2016-03-04 21:24:52

标签: c# asp.net-mvc razor lambda razorengine

声明

如果您发现以下任何内容有任何错误的假设,请告知我们。我已经做了相当多的工作,但如果有更好的方法,我很乐意抛出我所拥有的东西。

短版

我需要复制MVC @Html.DisplayFor()函数的功能,而无需访问Controller Context。

背景

我试图从Razor(.cshtml)文件生成PDF文档。我以前使用的是Rotativa(基于wkhtml),它似乎工作得相当好。但是,我有时需要生成数百个文档,我想异步这样做以节省时间。不幸的是,似乎异步的任何东西都无法访问Rotativa所需的Controller上下文。此外,研究表明wkhtml一般不能异步运行。

当前尝试的解决方案

所以,现在我尝试使用Antaris RazorEngine将Razor视图渲染为HTML字符串,而不使用使用控制器上下文。然后,我将该HTML提供给iTextSharp来制作PDF。我相信这应该能够异步运行(如果有人知道相反的情况,请纠正我)。

解决方案的问题

我们的Razor视图严重依赖HtmlHelper对象(需要访问Controller Context)来执行@Html.LabelFor()@Html.DisplayFor()之类的操作。我相信我已经能够将LabelFor功能复制为独立的帮助方法。不幸的是,DisplayFor方法更具挑战性。使用LabelFor,我只需要获取有关通过lambda表达式传入的对象属性的信息。相比之下,DisplayFor需要获取通过lambda表达式传入的对象的

我尝试过的事情

  • 我已经回顾了几十篇关于获取所有需要访问htmlHelper对象的值的帖子(example),以及因此无法访问的ControllerContext。
  • 我发现了一些帖子(example)似乎与我想要完成的内容非常相似,但它们似乎需要访问Model对象,而我这样做了。我不确定我能得到。我真正可以使用的是lambda表达式中的数据。

我为文字墙道歉;我试图尽我所能打破它。提前感谢任何建议!

1 个答案:

答案 0 :(得分:0)

当然在输入所有内容之后,我发现了一个简单的解决方案:将模型从视图中作为参数传递给辅助函数。