2011-01-08 19 views
4

좋아,이 하나의 작동하지만, 나는 끔찍한 해킹의 정도에 대해 잘 모르겠습니다. 아무도 내가 한 일이 괜찮은지 아닌지, 왜 그런지 말해 줄 수 있습니까?자바 스크립트 문자열에 면도칼 템플릿

내 Razor와 JavaScript간에 템플릿을 공유해야 서버 측과 다른 클라이언트 측에서 템플릿을 공유 할 수있었습니다. 그래서, 여기에 내가 무슨 짓을 :

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

을 그리고,이 같은 내보기에 내 템플릿을 사용 :

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

그리고 자바 스크립트를 나는이 한 :

<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) 

및 자바 스크립트 :

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

그리고 전화 자바 스크립트이 도우미 쓸 수있는 약간의 단순화 : 다음

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