0

CastleMonoRailsとNVelocityビューエンジンのタグ<head>内のマークアップからタグへの外部CSSファイルへのリンクをプログラムで追加する方法を見つけようとしています。<body>誰もがこれを行う方法を知っていますか?

<link ..>私が作業しているページは多くの「ウィジェット」で構成されている可能性があるため、この問題を解決する必要があります。各ウィジェットは、bodyタグ内に配置してレンダリングの問題を引き起こすのではなく、JSやCSSなどの追加のアセットを最適に取得します。

4

4 に答える 4

1

ビューからレイアウトに追加することについて話しているのですか?ビューはレイアウトの前にレンダリングされるため、スタイルブロックのレンダリングを処理するヘルパーを作成すると、問題が解決します。

つまり、ビューまたはビューコンポーネントで、次のようなものを呼び出すことができます。

$Style.Add("/static/style1.css")

レイアウト(ヘッドセクション):

$Style.Render()

ヘルパーの例を次に示します(AbstractHelperの継承はオプションです)。

public class StyleHelper : AbstractHelper
{
    private readonly HashedSet<string> sheets = new HashedSet<string>();

    public void Add( string styleSheet )
    {
        Add( styleSheet, "all" );
    }

    public void Add( string styleSheet, string media )
    {
        this.sheets.Add( String.Format( "media=\"{0}\" href=\"{1}\"", media, styleSheet ) );
    }

    public string Render()
    {
        var str = new StringBuilder();

        this.sheets.ToList().ForEach( sheet => str.AppendLine( String.Format( "<link rel=\"stylesheet\" {0} />", sheet ) ) );

        return str.ToString();
    }
}

AbstractHelperは、Castle.Monorail.Framework.Helpersの一部です。その抽象的な実装によって公開された機能を利用したい場合を除いて、それを継承する必要はありません。次に、それをベースコントローラーまたは特定のコントローラーのいずれかのコントローラーに追加します。

[Helper( typeof( StyleHelper ), "Style" )]
public class YourController
于 2011-05-31T17:49:10.730 に答える
1

ここに掲載されているソリューションは正しく機能していません。より良いアプローチは、スクリプトをhttpContext.Current.Itemsに追加することです。

@jishiと同じ構造を使用します。

ビューまたはviewcomponentで、次のようなものを呼び出すことができます。

$Style.Add("/static/style1.css")

レイアウト(ヘッドセクション):

$Style.Render()

ヘルパーは、httpcontextを使用してファイルのリストを保存および取得する2つの簡単な方法で構成されています。

    public class StyleHelper
{
    public static void Add(string file) {
        if (string.IsNullOrWhiteSpace(file))
            return;

        var obj = HttpContext.Current.Items["AssetFiles"] as List<string>; // get the collection which might be empty
        if (obj == null || obj.Count == 0) {
            IList<string> list = new List<string>();
            list.Add(file.ToLower());
            HttpContext.Current.Items.Add("AssetFiles", list); // adds your first asset to your collection and returns
            return;
        }

        if (obj.Contains(file.ToLower()))
            return; // asset is already added

        // new asset ready to be added to your collection
        obj.Add(file.ToLower());
        HttpContext.Current.Items.Add("AssetFiles", obj);
    }

    public string Render() {
        var obj = HttpContext.Current.Items["AssetFiles"] as List<string>;
        if (obj == null || obj.Count == 0)
            return ""; // you never added anything to the collection. Nothing more to do.

        // not using linq here for the sake of readability:
        string res = string.Empty;
        foreach (var item in obj) {
            res = res + string.Format("<link rel=\"stylesheet\" {0} />", item);
        }
        return res;
    }

}

コントローラ(できればベースコントローラ)にこれを追加します:

[Helper(typeof(StyleHelper)、 "Style")] public class YourController

于 2013-02-09T09:41:17.957 に答える
0

CaptureFor

ここで探していたものを正確に実行するコンポーネントがあることがわかりました。

ビューで:

#capturefor(capturefortest)
    Default way of printing. Use this for unique variables, such as title.
#end

#blockcomponent(CaptureFor with "id=capturefortest" "append=before")
    This will append before 1.
#end

#blockcomponent(CaptureFor with "id=capturefortest" "append")
    This will append after 1.
#end

#blockcomponent(CaptureFor with "id=capturefortest" "append")
    This will append after 1 and 3.
#end 

#blockcomponent(CaptureFor with "id=capturefortest") 
    Overrides everything defined before this. 
#end

レイアウト/マスターページ:

$capturefortest

エスケープ#:

たとえば、jQuery IDセレクターの#blockcomponent(CaptureFor)内に#を配置すると、エラーが発生します。これは、AssetFilterでグローバルに使用可能な変数を設定し、$ {HASH}を使用して#を出力することで回避できます。一重引用符と引用符もあります。

controllerContext.PropertyBag.Add("HASH", "#");
controllerContext.PropertyBag.Add("Q", '"');
controllerContext.PropertyBag.Add("sq", "'");

今、あなたは安全に行うことができます:

#blockcomponent(CaptureFor with "id=capturefortest" "append=before")
    <script type="text/javascript">
        jQuery('#container').html('Awesomeness!')
    </script>
#end
于 2012-06-05T06:24:11.870 に答える
-1

Javascriptのおかげで可能です!これが私がスタイルを追加する方法です<head>

<script type="text/javascript">
    var cssNode = document.createElement('link');
    cssNode.setAttribute('rel', 'stylesheet');
    cssNode.setAttribute('href', 'http://path.to/your/file.css');
    cssNode.setAttribute('type', 'text/css');
    document.getElementsByTagName('head')[0].appendChild(cssNode);
</script>
于 2011-05-31T14:15:34.873 に答える