0

I have a razor view and I want to store the compiled version in a string and send a mail containing it

I've tried this :

string body = Engine.Razor.RunCompile(template,"templateKey",null,model);

but I received this error:

Could not load type 'System.Security.Principal.WindowsImpersonationContext

2 Answers2

0

Maybe you can look here https://www.learnrazorpages.com/advanced/render-partial-to-string and see how to get razor view to string.

After you get razor view as html string you can use that string as body for email.

dewebeloper
  • 43
  • 1
  • 9
0

Also for sending emails you may use xsl templates and bing xml data wıth template and create your html content

private string getEMailBodyAccountForgetPassword(User User)
{
    string recieverName = User.Name;
    string validationKey = User.ValidationKey;
    string applicationDisplayName = applicationName;
    string resetLink = $"{host}/account/resetpassword/start/{validationKey}";
    string template = emailTemplateRootPath + "\\Account\\ForgetPassword\\ForgetPassword.xsl";

    string xmlData = "<email>";
    xmlData += $"<recievername>{recieverName}</recievername>";
    xmlData += $"<link>{resetLink}</link>";
    xmlData += $"<applicationdisplayname>{applicationDisplayName}</applicationdisplayname>";
    xmlData += "</email>";

    string body = Fabrikafa.Common.Functions.BindXslData(xmlData, template);

    return body;
}

Here is the bind method:

public static string BindXslData(string XmlData, string XslFile)
{
    string empty = string.Empty;
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.LoadXml(XmlData);
    XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
    xslCompiledTransform.Load(XslFile);
    XPathNavigator input = xmlDocument.CreateNavigator();
    StringBuilder stringBuilder = new StringBuilder();
    XmlWriter xmlWriter = XmlWriter.Create(stringBuilder);
    xslCompiledTransform.Transform(input, xmlWriter);
    xmlWriter.Close();
    return stringBuilder.ToString();
}

Here is the xsl template:

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="msxsl">

    <xsl:output method="html" indent="yes"/>

    <xsl:template match="@* | node() | /">
        <html>
            <head>
                <link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet"/>
                <style>
                    body {
                    font-family: 'PT Sans', sans-serif;
                    }
                </style>
            </head>
            <body>
                <div>
                    <img src="https://eu2.contabostorage.com/80ec950384cb46a8bf00f0e75660cedf:fabrikafa.content/Logo/apps/Yoneticim.EmailProviders-Logo-sm.png" /><br/>

                    <h2>
                        <xsl:value-of select="//email/applicationdisplayname"/> - Password Reset
                    </h2>
                    Dear <xsl:value-of select="//email/recievername"/>,<br/>
                    <br/>

                    To reset your password, please click link below.<br/>
                    <br/><br/>

                    <a href="https://{//email/link}" target="_blank">
                        https://<xsl:value-of select="//email/link"/>
                    </a>
                    <br/>
                    <br/>
                    <br/>
                    <b>
                        <xsl:value-of select="//email/applicationdisplayname"/> Team
                    </b>
                </div>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
Ozan BAYRAM
  • 2,780
  • 1
  • 28
  • 35
  • XSL templates are not maintainable unless you have an XSL expert on staff, which is rare. Razor pages already have this templating capability. – Robert Harvey Feb 16 '23 at 12:25