将Razor页面用作邮件模板我试图使用@Html.Raw(Model.Content)
显示邮件内容(Html内容)。
无论何时我运行代码,我都会收到此错误:html does not exist in current context
。
我在另一个剃刀页面上尝试了此@Html.Raw("<strong>Bold!</strong>")
以验证RazorEngine
已安装,并且显示完好且无错误。
答案 0 :(得分:8)
在做电子邮件时,我在RazorEngine.Templating中使用RazorEngineService,例如就我而言,它看起来像这样:
using RazorEngine.Templating;
RazorEngineService.Create().RunCompile(html, ...)
假设您使用的是同一个程序集,@ Html.Raw在此用法中存在 NOT 。通过在我的电子邮件中执行此操作,我终于能够获得原始HTML输出:
@using RazorEngine.Text
@(new RawString(Model.Variable))
答案 1 :(得分:2)
@using RazorEngine.Text
@(new RawString(Model.Variable))
在邮件模板cshtml视图中使用此代码。
答案 2 :(得分:0)
我的答案,使用here中的hannes neukermans答案。
我需要在MVC项目中使用RazorEngine来发送包含存储在数据库中的html字符串的电子邮件,以便管理员用户可以对其进行编辑。
标准的RazorEngine配置不允许@ Html.Raw工作。
在我的电子邮件课程中,我设置了一个新的Engine.Razor(Engine是静态的),其中包含了Hannes建议的课程。我只需要Raw方法,但是您显然可以添加其他方法:
您将需要这些:
using RazorEngine;
using RazorEngine.Templating; // For extension methods.
using RazorEngine.Text;
using RazorEngine.Configuration;
这些是提供@Html帮助器的类
public class HtmlSupportTemplateBase<T> : TemplateBase<T>
{
public HtmlSupportTemplateBase()
{
Html = new MyHtmlHelper();
}
public MyHtmlHelper Html { get; set; }
}
public class MyHtmlHelper
{
/// <summary>
/// Instructs razor to render a string without applying html encoding.
/// </summary>
/// <param name="htmlString"></param>
/// <returns></returns>
public IEncodedString Raw(string htmlString)
{
return new RawString(WebUtility.HtmlEncode(htmlString)); //you may not need the WebUtility.HtmlEncode here, but I did
}
}
然后我可以在电子邮件模板中使用@ Html.Raw来合并可编辑的html
public class Emails
{
public static TemplateServiceConfiguration config
= new TemplateServiceConfiguration(); // create a new config
public Emails()
{
config.BaseTemplateType = typeof(HtmlSupportTemplateBase<>);// incorporate the Html helper class
Engine.Razor = RazorEngineService.Create(config);// use that config to assign a new razor service
}
public static void SendHtmlEmail(string template, EmailModel model)
{
string emailBody
= Engine.Razor.RunCompile(template, model.Type.ToString(), typeof(EmailModel), model);
var smtpClient = getStaticSmtpObject(); // an external method not included here
MailMessage message = new MailMessage();
message.From = new MailAddress(model.FromAddress);
message.To.Add(model.EmailAddress);
message.Subject = model.Subject;
message.IsBodyHtml = true;
message.Body = System.Net.WebUtility.HtmlDecode(emailBody);
smtpClient.SendAsync(message, model);
}
}
然后,我可以通过传入从实际的.cshtml模板读取的字符串和保存电子邮件数据的模型来使用它。
string template = System.IO.File.ReadAllText(ResolveConfigurationPath("~/Views/Emails/Email.cshtml"));
SendHtmlEmail(template, model);
ResolveConfigurationPath是我发现的另一个外部函数。
public static string ResolveConfigurationPath(string configPath)
{
if (configPath.StartsWith("~/"))
{
// +1 to Stack Overflow:
// http://stackoverflow.com/questions/4742257/how-to-use-server-mappath-when-httpcontext-current-is-nothing
// Support unit testing scenario where hosting environment is not initialized.
var hostingRoot = HostingEnvironment.IsHosted
? HostingEnvironment.MapPath("~/")
: AppDomain.CurrentDomain.BaseDirectory;
return Path.Combine(hostingRoot, configPath.Substring(2).Replace('/', '\\'));
}
return configPath;
}