使っています郵便MVC Razor ビューをレンダリングし、電子メールで送信します。電子メール ビュー専用に定義したカスタム CSS があります。現在、次のように含めています。
@Styles.Render("~/Content/EmailStyles.css")
ただし、これにはスタイルシートへの相対リンクのみが含まれるため、電子メールでは機能しません。
<link href="/Content/EmailStyles.css" rel="stylesheet"/>
メールで適切に機能するように、スタイルシートをインラインで含めたいです。MVC ビュー内でファイルベースのリソースの内容をレンダリングする最適な方法は何ですか?
ベストアンサー1
私も同じ疑問を抱いていましたが、プレメーラーネット必要なライブラリのようです。次の手順を実行してください。
CSSをページに埋め込むための拡張メソッドを作成します。Razor ビューに HTML を埋め込む方法に関する質問への回答役に立つはずです。CSS を埋め込むために修正しました:
public static class HtmlHelpers { public static MvcHtmlString EmbedCss(this HtmlHelper htmlHelper, string path) { // take a path that starts with "~" and map it to the filesystem. var cssFilePath = HttpContext.Current.Server.MapPath(path); // load the contents of that file try { var cssText = System.IO.File.ReadAllText(cssFilePath); var styleElement = new TagBuilder("style"); styleElement.InnerHtml = cssText; return MvcHtmlString.Create(styleElement.ToString()); } catch (Exception ex) { // return nothing if we can't read the file for any reason return null; } } }
次に、Razor テンプレートで次のように実行します。
@Html.EmbedCss("~/Content/EmailStyles.css")
CSS テキストを埋め込む。
プロジェクトに Premailer.Net パッケージをインストールします。これは NuGet から取得できます。
Razorビューを文字列にレンダリングします(プロセス内でPostalがそのためにあるのかな?Razorエンジンそれも可能です。
文字列を Premailer.Net で実行します。
PreMailer pm = new PreMailer(); string premailedOutput = pm.MoveCssInline(htmlSource, false);
メールで送信!
私はしばらくの間、この手法を制作現場で使用してきましたが、非常にうまく機能しているようです。
編集: 疑似要素のスタイルはインライン化できないマークアップには存在しないからです。また、Premailer.Net に奇妙な小さなバグがあることにも気付きました。その詳細度とカスケード ルールは完全には準拠していないと思います。それでも、かなり良いですし、書く必要がなかったコードがもう 1 つ増えたことになります。