2011-01-08 90 views
4

好吧,我這一個工作,但我不知道如何可怕的黑客與其說這是。任何人都可以告訴我,我所做的事是否可以,爲什麼?剃刀模板JavaScript字符串

我需要分享我的剃刀和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看起來像一個壞主意給我。個人而言,我會寫一個控制器:包含標記

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

和部分(~/Views/Shared/EditorTemplates/Item.cshtml):

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

然後,如果我需要一個強類型的視圖中使用它,我只需使用編輯模板:

@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 2011-01-19 18:17:55

0

這對我來說很好。雖然我建議調查@helper語法,這隻會稍微改變模板的用法。

+0

是,通過定義一個幫手,我可以丟棄動態參數,那肯定使代碼更清晰。但是我只會在一個視圖中使用這個模板,因此我不知道是否值得它定義一個完整的幫手來做到這一點。但感謝您的建議!我一定會考慮它。 – rdumont 2011-01-11 10:00:14