2011-01-08 6 views
4

これはうまく機能していますが、これは恐ろしいハックのどれくらいか分かりません。私がしたことが大丈夫かどうか、そしてなぜなのか誰にでも教えてもらえますか?ひらめきテンプレートからjavascript文字列

私はRazorとJavaScriptの間でテンプレートを共有する必要があったので、それをサーバー側と他のクライアント側で使用することができました。だから、ここで私がやったことです:

Func<dynamic, HelperResult> sampleTemplate = 
    @<span>Sample markup @item.Something</span>; 

その後、私はこのような私の見解で私のテンプレートを使用:

for(int idxSample = 0; idxSample < Model.Number; idxSample++) { 
    @sampleTemplate(new { Something = "" }) 
} 

そして、私はこれをしなかったのjavascriptのために:だから

<script type="text/javascript"> 
    var someJsTemplate = "" + 
     <r><[!CDATA[@sampleTemplate(new { Something = "" })]]></r>; 
</script> 

私が後でそれを必要とするときはsomeJsTemplateを付けることができた。だから、判決は何ですか?誰かがそれを行うためのよりよい方法を見ていますか?それとも大丈夫ですか?

編集:

今、私はこれを使用することはできません。 FireFoxでは正常に動作しますが、Chromeではハックを許可していません。どんな助け?

答えて

2

サーバーサイドコードにHTMLを格納することは悪い考えです。私は単にエディタのテンプレートを使用することになり、強く型付けされたビューでそれを使用する必要がある場合は、

@model AppName.Models.Item 
@{ 
    Layout = null;    
} 
<span>Sample markup @Model.Something</span> 

:マークアップを含む

public class TemplatesController: Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Index(Item item) 
    { 
     return View("~/Views/Shared/EditorTemplates/Item.cshtml", item); 
    } 
} 

と部分(~/Views/Shared/EditorTemplates/Item.cshtml):個人的に私は、コントローラを記述します:

@Html.EditorFor(x => x.Items) 

とJavaScriptで:

​​

そして、このJavaScriptは、あなたがヘルパーを書くことができ呼んで少し簡素化する。その後、

public static class HtmlExtensions 
{ 
    public static MvcHtmlString Template(this HtmlHelper htmlHelper, object item) 
    { 
     return MvcHtmlString.Create(
      HttpUtility.JavaScriptStringEncode(
       htmlHelper.Action("index", "templates", item).ToHtmlString() 
      ) 
     ); 
    } 
} 

と:

<script type="text/javascript"> 
    var someJsTemplate = '@Html.Template(new { something = "abc" })'; 
</script> 
+0

サーバー側にHTMLを保存することについては、まあ、それは剃刀のビューですよね?したがって、それはサーバー側であり、HTMLを含んでいます。しかし、JavaScriptStringEncodeについては、このチップのおかげで非常に感謝しています!何が起こったのか、私はJavaScriptStringEncodeがやっていることをほぼ実践するヘルパーを書いたばかりです。もし私が知っていたら、私はある時間を救ったかもしれない...とにかく、タンク! – rdumont

+0

@rdumont、ええ 'JavaScriptStringEncode'はあなたのサイトをXSSに喜んでくれる悪い人からあなたを守ります:-) –

0

それは私によく見えます。 @helper構文を調べることをお勧めしますが、これはテンプレートの使い方をわずかに変更するだけです。

+0

はい、ヘルパーを定義することによって、私はその動的パラメータをドロップすることができ、それは間違いだろうコードを明確にする。しかし、私はこのテンプレートを単一のビューでしか使用しないので、それを行うヘルパー全体を定義する価値があるかどうかはわかりません。しかし、アドバイスをいただきありがとうございます!私は確かにそれを検討します。 – rdumont

関連する問題