我有以下RazorEngine电话:
public class RazorEngineRender
{
public static string RenderPartialViewToString(string templatePath, string viewName, object model)
{
string text = System.IO.File.ReadAllText(Path.Combine(templatePath, viewName));
string renderedText = Razor.Parse(text, model);
return renderedText;
}
}
这来自:
_emailService.Render(TemplatePath, "Email.cshtml", new { ActivationLink = activationLink });
我也有这个视图文件(email.cshtml):
<div>
<div>
Link: <a href="@Model.ActivationLink" style="color:#666" target="_blank">@Model.ActivationLink</a>
</div>
</div>
当调用Razor.Parse()时,我总是得到一个: 无法编译模板。检查错误列表以获取详细信息。
错误列表是:
error CS1061: 'object' does not contain a definition for 'ActivationLink' and no extension method 'ActivationLink' accepting a first argument of type 'object' could be found
我在阳光下尝试了一切,包括尝试一种具体类型而不是匿名类型,在视图文件的顶部声明@Model行但没有运气。我想知道图书馆是错还是肯定我?
顺便说一句,我所指的razorengine可以在codeplex找到: RazorEngine
答案 0 :(得分:18)
如果您这样打电话:
Razor.Parse(System.IO.File.ReadAllText(YourPath),
new { ActivationLink = activationLink });
这应该给你正确的输出。但是,在我看到上面发布的方法之后,我将能够确定问题所在。
将您的方法更改为以下内容:
public class RazorEngineRender {
public static string RenderPartialViewToString<T>(string templatePath, string viewName, T model) {
string text = System.IO.File.ReadAllText(Path.Combine(templatePath, viewName));
string renderedText = Razor.Parse(text, model);
return renderedText;
}
}
你可以像上面那样打电话。
它不起作用的原因是因为你告诉Parser模型是object类型而不是传递它真正的类型。在这种情况下是匿名类型。
答案 1 :(得分:6)
2011年接受的答案是完美的(我相信RazorEngine的前3版)但是这个代码现在在最新版本中被标记为过时(在输入时为3.7.3)。
对于较新版本,您的方法可以这样输入:
public static string RenderPartialViewToString<T>(string templatePath, string templateName, string viewName, T model)
{
string template = File.ReadAllText(Path.Combine(templatePath, viewName));
string renderedText = Engine.Razor.RunCompile(template, templateName, typeof(T), model);
return renderedText;
}
为了使其正常工作,您需要添加
using RazorEngine.Templating;
答案 2 :(得分:1)
以下是您可能尝试的一些提示:
让您的剃刀视图强烈输入模型:
@model Foo
<div>
<div>
Link:
<a href="@Model.ActivationLink" style="color:#666" target="_blank">
@Model.ActivationLink
</a>
</div>
</div>
渲染时,它会传递Foo
模型:
_emailService.Render(
TemplatePath,
"Email.cshtml",
new Foo { ActivationLink = activationLink }
)
如果您尝试从观看中发送电子邮件,请确保在重新发明内容之前checkout Postal。