44

ASP.NET 4.5 のバンドルと縮小を試したところ、問題が発生しました。

私は約 10 個の css ファイルを持っています。そのうちの 2 個はもともと属性 media="screen" を使用してレイアウトで参照されていました。

バンドルに css を追加するための構文では、そのような属性を追加する必要があることを指定できないため (属性はバンドル全体に適用されるため、理にかなっています)、@Styles.Render のオーバーロードが表示されることを期待していました。他の Html ヘルパーと同様に、html 属性を指定できますが、何もありません。

作成されたバンドルの URL を知っているため、自分でタグを作成することもできますが、ASP.NET がタグ自体をレンダリングできるようにすることで、ASP.NET によって処理されるキャッシュ メカニズムが失われてしまいます。

これを行う方法はありますか、何か不足していますか? それとも、これは設計チームの単なる見落としですか?

4

8 に答える 8

77

よりエレガントなソリューションを見つけました。

を使用していStyles.RenderFormat(format, bundle)ます。

と呼ばれるプロパティを持つBundlesFormatsクラスがあり、次のPRINTように使用します。

public class BundlesFormats
{
    public const string PRINT = @"<link href=""{0}"" rel=""stylesheet"" type=""text/css"" media=""print"" />";
}

そしてcshtmlで:

@Styles.RenderFormat(BundlesFormats.PRINT, "~/bundles/Content/print")
于 2013-03-10T19:55:23.700 に答える
14

まあ、これは醜いハックですが、チームが次のリリースでそれを行うための組み込みの方法を追加することを願っています.

これが私が解決した方法で、キャッシュ文字列を維持し、メディア属性をタグに追加できます。

@{
    var cssMediaBundleUrl = BundleTable.Bundles.ResolveBundleUrl("~/stylesheets/mediacss", true);
}
<link href="@cssMediaBundleUrl" rel="stylesheet" type="text/css" media="screen" />

これを Html ヘルパーに変換できると思います。後でそれを行って編集します。

于 2012-08-20T20:19:00.790 に答える
6

デバッグ機能を損なうことなく、この問題を解決する別のオプションは次のとおりです。

public static IHtmlString Render(string path, IDictionary<string, object> htmlAttributes)
{
    var attributes = BuildHtmlStringFrom(htmlAttributes);

#if DEBUG
    var originalHtml = Styles.Render(path).ToHtmlString();
    string tagsWithAttributes = originalHtml.Replace("/>", attributes + "/>");
    return MvcHtmlString.Create(tagsWithAttributes);
#endif

    string tagWithAttribute = string.Format(
        "<link rel=\"stylesheet\" href=\"{0}\" type=\"text/css\"{1} />", 
        Styles.Url(path), attributes);

    return MvcHtmlString.Create(tagWithAttribute);
}

私がやっていることは、指定された html 属性をタグの末尾 (デバッグ モードの場合) または唯一のリンク タグの末尾 (縮小/バンドルが有効な場合) に追加することです。

ビューでの使用法:

@Bundles.Render("~/css/print", new { media = "print" })

コードの残りの部分:

public static IHtmlString Render(string path, object htmlAttributes)
{
    return Render(path, new RouteValueDictionary(htmlAttributes));
}

private static string BuildHtmlStringFrom(IEnumerable<KeyValuePair<string, object>> htmlAttributes)
{
    var builder = new StringBuilder();

    foreach (var attribute in htmlAttributes)
    {
        builder.AppendFormat(" {0}=\"{1}\"", attribute.Key, attribute.Value);
    }

    return builder.ToString();
}

このテーマについてブログ投稿を書きました: http://danielcorreia.net/blog/quick-start-to-mvc4-bundling/

于 2012-12-05T22:40:53.913 に答える
3

残念ながら、現在タグがどのようにレンダリングされるかをフックする優れた方法はありません。フックを追加して、各スクリプト/スタイルタグをレンダリングする独自のメソッドを追加できるようにすることを検討しました。そうする必要があるようです。追加は非常に簡単なはずですが、このシナリオを有効にするための作業項目を作成します...

一時的な回避策として、Styles.Renderが提供するデバッグ/リリース機能を失っても構わないと思っている場合は、Styles.Urlを使用してバンドルへの参照をレンダリングできます。これにより、バンドルURLのみが提供されます。独自のタグ。

于 2012-08-20T19:04:44.653 に答える
0

Web フォーム ソリューション

BundleConfig.cs で:

//Print css must be a separate bundle since we are going to render it with a media=print
Bundles.Add(new StyleBundle("~/bundles/printCSS").Include("~/Content/Print.css"));

マスター ページ:

<asp:Literal runat="server" ID="litCssPrint" />

マスター ページ コード ファイル:

litCssPrint.Text = Styles.RenderFormat(@"<link href=""{0}"" rel=""stylesheet"" type=""text/css"" media=""print"" />", "~/bundles/printCSS").ToHtmlString();
于 2016-03-23T23:45:51.840 に答える
-1

非常に複雑なので、使用しない理由:

bundles.Add<StylesheetBundle>("~/Css/site.css", b => b.Media = "screen");

?

于 2013-10-11T10:13:33.587 に答える