2010-11-28 14 views
14

RazorでHtmlの一部を変数にレンダリングするには? は、Sparkで、私は次のコードを記述するために使用:Razor - 変数にコンテンツをレンダリングする方法

<content var="t"> 
    <a class="tab" href="">Tab name</a> 
</content> 

<content var="tc"> 
    <div class="tabcontent"> 
     <p>Here goes tab content</p> 
    </div> 
</content> 

!{tabs(t, tc)} 

2つの変数が、タブのシートに、すべてのコンテンツの素敵なラッピングを行うマクロに渡されます。

Razorで同じことを行うにはどのような方法が最適ですか?

アップデート:私は、私はそれを得たと思う ..カミソリで

は、@<text>...</text>構築物は、HTMLの一部を割り当てるの拡張と同等である、後で再利用できるラムダ式を生成するために、ユーザーことができ変数に変換する。私はちょうどパラメータなしラムダ(Func<object>)を作成する方法を見つけ出すことはできません

Func<int, object> t = 
    @<text> 
     <a class="tab" href="">Tab name</a> 
    </text>; 

Func<int, object> tc = 
    @<text> 
     <div class="tabcontent"> 
      <p>Here goes tab content</p> 
     </div> 
    </text>; 


@tabs(t(0), tc(0)) 

:上記の例では、以下の方法で実施することができます。上記の両方のlambdaのパラメータintはダミーです。 Razorは1つのパラメータを必要としているようです(そして、式の中にそれを表す変数 "item"をすでに作成しています)。

答えて

5

おそらくあなたはHtmlStringを使用できますか?私はずっとこれが好きだと思うが、ここで私はあなたが持っているものの正確な翻訳として試してみたものです...

@{ 
    var t = new HtmlString("<a class='tab' href=''>Tab name</a>"); 
    var tc = new HtmlString("<div class='tabcontent'><p>Here goes tab content</p></div>"); 
} 
@tabs(t, tc) 

だから... ...私はあなたのスパークマクロがどのようなものか知りませんませんしかし、それはかみそりでヘルパーを使用する機会のように思えます。そして、あなたがあなたのページ内からそのようにすることを呼び出す

@helper Tabs(string tabName, string tabContent) 
{ 
    <!-- some wrapper code --> 
    <a class="tab" href="">@(tabName)</a> 
    <!-- some more wrapper code --> 
    <div class="tabcontent"> 
     <p>@(tabContent)</p> 
    </div> 
    <!-- still more wrapper code --> 
} 

@Tabs("Tab Name", "Here goes tab content") 
+0

おかげで、私は本当にインラインヘルパー構文で必要なものだと思います。私はこれをまだ剃刀で入手できません。解決策は明示的ヘルパーを宣言することであり、呼び出すことができ、結果を変数に代入することができる。 – Andy

+0

私は上記のコメントに間違っていました。構文は利用可能であり、明示的なヘルパーは必要ありません。代わりにラムダ式を使用できます。更新された質問を参照してください。 – Andy

5

(私が行ったように)誰がアンディの更新がほとんど存在し、この記事を見つけ念のためにあなたのような何かを持っているかもしれません。与えられた例に加えて、与えられた例の 'int'にアクセスするために必要なことは、参照@itemです。 @<text></text>ブロックでは、変数itemには、呼び出されたモデルが含まれています。あなたは、おそらく代わりに、このような関数の部分図を使用する必要があります

@model PageData 

@{ 
    Func<Customer, object> sayHi = 
     @<text> 
      <li>Hello @(item.FirstName)!</li> 
     </text>; 
} 

<ul> 
    @foreach(var customer in Model.Customers) 
    { 
     sayHi(customer); 
    } 
</ul> 

ほとんどの場合:

は、ここでそれを使用することができる方法の例です。しかし、まれに、(RazorEngineライブラリを使用する場合など)部分的なビューが不可能な場合、これは機能します。持っているだけでremmebr、オペレータ:テキストは1行に対するものである場合

@{ 
    Func<dynamic, object> a = @<text> 
     Some Text   
    </text>; 
    @a(new object()) 
}  

だけあなたも「@」を使用することができます

+0

あなたは、よく知られていないという事実を指摘しました、ありがとう! – Sel

7

は、基本的にはOPは、すでにあなたのような何かができるという問題に答え次の例のように、次の行にセミコロン(またはそれは任意の閉じ括弧や括弧を必要とする場合)、:あなたは

をしたい場合は

@{ 
    Func<dynamic, object> a = @: Some Text 
    ;  
    @a(new object()) 
} 

あなたは文字列としてそれを直接取り込むことができますしかし、

あなたも、関数の中でそれをカプセル化することができます:あなたはカミソリビューでIHtmlContentBuilderを持って

@functions{ 
    public string ToString(Func<dynamic, object> input) 
    { 
      return input("").ToString(); 
    } 
} 

@{ 
    string a = ToString(@<text> 
        Some Text 
       </text>); 
    @a //Output directly as a string   
} 
0

場合は、これらの拡張機能を使用することができます。

public static IHtmlContentBuilder AppendRazor(this IHtmlContentBuilder htmlContentBuilder, Func<IHtmlContent, dynamic> lamda) 
    { 
     var html = lamda(null); 
     return htmlContentBuilder.AppendHtml(html); 
    } 

    public static IHtmlContentBuilder AppendRazor<T>(this IHtmlContentBuilder htmlContentBuilder, Func<T, IHtmlContent> lamda, T model) 
    { 
     var html = lamda(model); 
     return htmlContentBuilder.AppendHtml(html); 
    } 

使用

​​
関連する問題