如何从razor引擎获取ITemplate(IrazorenEngineService)
我刚刚将RazorEngine参考更新为3.7.5版。许多事情似乎已经改变,变得过时了。 对于大多数事情,我想出了“新方法”,除了一件事:获得一个如何从razor引擎获取ITemplate(IrazorenEngineService),razor,razorengine,Razor,Razorengine,我刚刚将RazorEngine参考更新为3.7.5版。许多事情似乎已经改变,变得过时了。 对于大多数事情,我想出了“新方法”,除了一件事:获得一个ITemplate实例 我们曾经使用模板服务实例。它有一个方法Resolve,该方法返回一个ITemplate实例 模板服务已替换为IRazorEngineService。这没有任何方法返回ITemplate 正确的检索方法是什么?正如我已经在一些线程中讨论过的,这里有一些引用: 您能否详细说明为什么需要直接访问该接口的实例? 我决定删除对它的直接访问
ITemplate
实例
我们曾经使用模板服务
实例。它有一个方法Resolve
,该方法返回一个ITemplate
实例
模板服务已替换为IRazorEngineService
。这没有任何方法返回ITemplate
正确的检索方法是什么?正如我已经在一些线程中讨论过的,这里有一些引用: 您能否详细说明为什么需要直接访问该接口的实例? 我决定删除对它的直接访问,因为它不容易使用,而且大多数情况下并不像您认为的那样。如果您使用隔离API,它也会导致问题 如果是关于设置自定义布局,正确的升级路径是使用自定义
TemplateBase
并使用ViewBag(如链接问题所述)
另一个更有趣的用例是从模板中获取数据。
这里详细讨论了这一点:
下面是一个关于如何从给定模板中提取“主题”的代码示例
模板:
@model HelloWorldModel
@{
Layout = "CI";
Subject = "Hello World";
}
Hello @Model.Name,<br/>
this is a test email...
@model HelloWorldModel
@{
布局=“CI”;
主题=“你好,世界”;
}
你好@Model.Name,
这是一封测试邮件。。。
代码(简化)
类CustomDataHolder{
公共字符串目标{get;set;}
公共字符串主题{get;set;}
}
//在自定义TemplateBase类中:
公共字符串Subject{get{return Viewbag.DataHolder.Subject;};set{Viewbag.DataHolder.Subject=value;}
//你的代码
公共静态任务SendEmailAsync(字符串模板名、字符串目标、T模型)
{
var holder=新的CustomDataHolder();
动态视图包=新的动态视图包();
viewbag.DataHolder=holder;
目的地=目的地;
var body=Engine.Razor.Run(templateName,typeof(T),model,(DynamicViewBag)viewbag);
MailMessage msg=新的MailMessage();
msg.To.Add(新邮件地址(持有者目的地));
msg.Subject=holder.Subject;
msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(body,null,MediaTypeNames.Text.Html));
SmtpClient SmtpClient=新的SmtpClient();
返回smtpClient.SendMailAsync(msg);
}
希望这涵盖了您的用例。否则,请在您的问题中添加更多信息,说明您试图通过ITemplate
实例实现什么
class CustomDataHolder {
public string Destination { get; set; }
public string Subject { get; set; }
}
// In the custom TemplateBase class:
public string Subject { get { return Viewbag.DataHolder.Subject; }; set { Viewbag.DataHolder.Subject = value; } }
// Your code
public static Task SendEmailAsync<T>(string templateName, string destination, T model)
{
var holder = new CustomDataHolder ();
dynamic viewbag = new DynamicViewBag();
viewbag.DataHolder = holder;
holder.Destination= destination;
var body = Engine.Razor.Run(templateName, typeof(T), model, (DynamicViewBag)viewbag);
MailMessage msg = new MailMessage();
msg.To.Add(new MailAddress(holder.Destination));
msg.Subject = holder.Subject;
msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html));
SmtpClient smtpClient = new SmtpClient();
return smtpClient.SendMailAsync(msg);
}