Razor ビューに CSS スタイルをインラインで含めるにはどうすればいいですか? 質問する

Razor ビューに CSS スタイルをインラインで含めるにはどうすればいいですか? 質問する

使っています郵便MVC Razor ビューをレンダリングし、電子メールで送信します。電子メール ビュー専用に定義したカスタム CSS があります。現在、次のように含めています。

@Styles.Render("~/Content/EmailStyles.css")

ただし、これにはスタイルシートへの相対リンクのみが含まれるため、電子メールでは機能しません。

<link href="/Content/EmailStyles.css" rel="stylesheet"/>

メールで適切に機能するように、スタイルシートをインラインで含めたいです。MVC ビュー内でファイルベースのリソースの内容をレンダリングする最適な方法は何ですか?

ベストアンサー1

私も同じ疑問を抱いていましたが、プレメーラーネット必要なライブラリのようです。次の手順を実行してください。

  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;
            }
        }
    }
    
  2. 次に、Razor テンプレートで次のように実行します。

    @Html.EmbedCss("~/Content/EmailStyles.css")
    

    CSS テキストを埋め込む。

  3. プロジェクトに Premailer.Net パッケージをインストールします。これは NuGet から取得できます。

  4. Razorビューを文字列にレンダリングします(プロセス内でPostalがそのためにあるのかな?Razorエンジンそれも可能です。

  5. 文字列を Premailer.Net で実行します。

    PreMailer pm = new PreMailer();
    string premailedOutput = pm.MoveCssInline(htmlSource, false);
    
  6. メールで送信!

私はしばらくの間、この手法を制作現場で使用してきましたが、非常にうまく機能しているようです。

編集: 疑似要素のスタイルはインライン化できないマークアップには存在しないからです。また、Premailer.Net に奇妙な小さなバグがあることにも気付きました。その詳細度とカスケード ルールは完全には準拠していないと思います。それでも、かなり良いですし、書く必要がなかったコードがもう 1 つ増えたことになります。

おすすめ記事