【发布时间】:2016-03-04 21:24:51
【问题描述】:
免责声明
如果您在以下任何内容中发现任何错误假设,请告诉我。我为此付出了相当多的努力,但如果有更好的方法,我很乐意把我所拥有的东西扔掉。
短版
我需要在不访问控制器上下文的情况下复制 MVC 的 @Html.DisplayFor() 函数的功能。
背景
我正在尝试从 Razor (.cshtml) 文件生成 PDF 文档。我以前使用过Rotativa(基于wkhtml),它似乎工作得很好。但是,我有时需要生成数百个文档,并且我想异步执行此操作以节省时间。不幸的是,似乎任何异步都无法访问 Rotativa 所需的控制器上下文。此外,研究表明 wkhtml 通常不能异步运行。
当前尝试的解决方案
所以,现在我正在尝试使用 Antaris RazorEngine 使用控制器上下文将 Razor 视图呈现为 HTML 字符串而不使用。然后,我将该 HTML 输入 iTextSharp 以制作 PDF。我相信这应该能够异步运行(如果有人知道相反的事情,请纠正我)。
解决方案的问题
我们的 Razor 视图严重依赖 HtmlHelper 对象(需要访问控制器上下文)来执行@Html.LabelFor() 或@Html.DisplayFor() 之类的操作。我相信我已经能够将 LabelFor 功能复制为独立的辅助方法。不幸的是,DisplayFor 方法被证明更具挑战性。使用 LabelFor,我只需要获取有关通过 lambda 表达式传入的对象属性的信息。相比之下,DisplayFor需要通过lambda表达式获取对象的value。
我的尝试
- 我已经查看了数十篇关于获取值的帖子 (example),这些帖子都需要访问 htmlHelper 对象,因此也需要访问 ControllerContext,这将不起作用。
- 我发现一些帖子 (example) 似乎与我要完成的任务非常相似,但它们似乎需要访问 Model 对象,我不确定我是否能获得。我真正拥有的只是 lambda 表达式中的数据。
我为文字墙道歉;我试图尽可能地打破它。提前感谢您的任何建议!
【问题讨论】:
标签: c# asp.net-mvc razor lambda razorengine