2011-01-08 14 views
4

Ok, ich habe diese funktioniert, aber ich bin mir nicht sicher, wie viel von einem schrecklichen Hack das ist. Kann mir jemand sagen, ob das, was ich getan habe, in Ordnung ist oder nicht, und warum?Rasiermesser Vorlage Javascript Zeichenfolge

Ich musste eine Vorlage zwischen meinem Razor und JavaScript teilen, damit man sie serverseitig und die andere clientseitige verwenden konnte. So, hier ist das, was ich getan habe:

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

Dann habe ich meine Vorlage in meiner Ansicht wie folgt aus:

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

Und für die Javascript habe ich dies:

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

So Ich könnte später someJsTemplate anhängen, wann immer ich es brauchte. Also, was ist das Urteil? Sieht jemand einen besseren Weg, es zu tun? Oder ist das in Ordnung?

Edit:

Jetzt kann ich das nicht verwenden. Obwohl es in FireFox funktioniert, lässt Chrome meinen Hack nicht zu. Irgendeine Hilfe?

Antwort

2

Das Speichern von HTML im serverseitigen Code scheint mir eine schlechte Idee zu sein. Persönlich würde ich einen Controller schreiben:

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

und eine teilweise (~/Views/Shared/EditorTemplates/Item.cshtml) enthält, das Markup:

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

Dann, wenn ich es in einer stark typisierten Ansicht verwenden muß, würde ich einfach eine Editor Vorlage verwenden :

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

und in javascript:

<script type="text/javascript"> 
    var someJsTemplate = '@HttpUtility.JavaScriptStringEncode(Html.Action("index", "templates", new { something = "abc" }).ToHtmlString())'; 
</script> 

Und ein wenig zu vereinfachen diese Javascript Sie rufen einen Helfer schreiben konnte:

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

und dann:

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

Über das Speichern von HTML in Server-Seite, naja ... es ist eine Razor-Ansicht, oder? Also, es ist serverseitig und es enthält HTML. Aber über den JavaScriptStringEncode, vielen Dank für den Tipp! Was passiert ist, ich habe gerade einen Helfer geschrieben, der praktisch praktisch das tut, was JavaScriptStringEncode tut. Könnte mir etwas Zeit erspart haben, wenn ich gewusst hätte ... Wie auch immer, tank dich! – rdumont

+0

@rdumont, yeah 'JavaScriptStringEncode' ist nützlich und schützt dich vor den bösen Jungs, die bereit sind, deine Site zu besuchen :-) –

0

Das sieht gut aus für mich. Obwohl ich vorschlagen würde, @helper-Syntax zu untersuchen, die die Verwendung der Vorlage nur geringfügig ändern würde.

+0

Ja, durch Definieren eines Helfer ich diesen dynamischen Parameter fallen könnte, würde es auf jeden Fall mache den Code klarer. Aber ich werde diese Vorlage nur in einer einzigen Ansicht verwenden, daher weiß ich nicht, ob es sich lohnt, einen ganzen Helfer zu definieren, nur um es zu tun. Aber danke für den Rat! Ich werde es mir sicherlich überlegen. – rdumont