2011-01-24 2 views
20

私は絶対に使いたいjQueryテンプレートを使用しています。 IDEの観点からの唯一の欠点は、スクリプトタグ内にHTML IntelliSenseがないことです。テンプレートスクリプトタグ内のマークアップがIntelliSenseと構文の強調表示を取得するようにVS2010をだます方法はありますか?VS2010 IntelliSense inside text/x-jquery-tmplスクリプトテンプレート

+0

あなたは万が一ASP.NET MVCを使用していますか? –

+0

これはVS2012で修正されているようです – Keith

答えて

3

エディタを騙して、コード(HTMLヘルパーなど)で記述するようなスクリプトタグを書いていることを知らない限り、私はできないと思います。私は、タグ名を変更して(またはコメントして)、一時的にタグを変更して、やり直しています。確かにそれは愚かな解決策です。

scriptタグを使用する代わりに、divのような他のタグを使用して、styleからdisplay:noneに設定することもできます。まったく同じ方法で動作するはずです(例:this articleの真中)。あなたは完全な構文の色付けを取得し、そのようにインテリセンスます

@Html.Template("whatever", @<text> 
    <tr><td>template stuff here</td></tr> 
</text>) 

よう

public static class HtmlExtensions 
{ 
    public static MvcHtmlString Template(this HtmlHelper htmlHelper, string id, Func<dynamic, HelperResult> content) 
    { 
     var sb = new StringBuilder(); 
     sb.AppendFormat("<script type='text/html' id='{0}'>", id); 
     sb.Append(content(null)); 
     sb.Append("</script>"); 

     return new MvcHtmlString(sb.ToString()); 
    } 
} 

用途:あなたはMVCを使用している場合

+0

こんにちはモハメド、これは私が探していたものです。 – Bob

+0

あなたは大歓迎です。それで、それが質問の正解であれば、答えに印を付けることができますか?どうもありがとう。 – Meligy

+0

ブラウザを隠しdivとしてレンダリングすると、ブラウザがコンテンツを解析するため、副作用が生じる可能性があります。もう1つの解決策は、ファイルを別のファイルに作成し、スクリプトタグをファイルから削除することです。 httphandlerまたはコードを介して外部からスクリプトタグをレンダリングします。 – Mrchief

3

あなたは、このようにHtmlHelperのための拡張メソッドを作ることができます。

4

を(ただし、VSはあなたのテンプレートがで構成された内容に応じHTML要素の無効な営巣について警告かもしれません)私は(ASP.NET 4つのWebフォームアプリケーションのために。)単純なカスタムサーバーサイドのコントロールを作成することで、この問題を解決したい:

[ToolboxData("<{0}:JqueryTemplate runat=server></{0}:JqueryTemplate>")] 
[PersistChildren(true)] 
[ParseChildren(false)] 
public class JqueryTemplate : Control { 
    private bool _useDefaultClientIdMode = true; 

    [DefaultValue(ClientIDMode.Static)] 
    [Category("Behavior")] 
    [Themeable(false)] 
    public override ClientIDMode ClientIDMode { 
     get { 
      return (_useDefaultClientIdMode) ? ClientIDMode.Static : base.ClientIDMode; 
     } 
     set { 
      base.ClientIDMode = value; 
      _useDefaultClientIdMode = false; 
     } 
    } 

    protected override void Render(HtmlTextWriter writer) { 
     writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/x-jquery-tmpl"); 
     writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID); 
     writer.RenderBeginTag(HtmlTextWriterTag.Script); 
     base.Render(writer); 
     writer.RenderEndTag();   
    } 

} 

と(<script>タグの代わりに)その中に各jqueryのテンプレートを置く:

<script type="text/x-jquery-tmpl" id="myTemplateId"> 
... your template code goes here ... 
</script> 

<some:JqueryTemplate runat="server" ID="myTemplateId"> 
... your template code goes here ... 
</some:JqueryTemplate> 

はとHTMLでそれをレンダリングします

6

私はHtml.BeginFormに触発され、このように動作しますASP.NET MVC 3のためのヘルパーメソッド、作成:ビュー内

を:@usingの範囲内

@using (Html.BeginHtmlTemplate("templateId")) 
{ 
    <div>enter template here</div> 
} 

ものは強調表示されます構文。

ヘルパーのコード:錆びたのソリューションのように徹底やエレガントな

public static class HtmlHelperExtensions 
{ 
    public static ScriptTag BeginHtmlTemplate(this HtmlHelper helper,string id) 
    { 
     return new ScriptTag(helper,"text/html", id); 
    } 
} 

public class ScriptTag : IDisposable 
{ 
    private readonly TextWriter writer; 

    private readonly TagBuilder builder; 

    public ScriptTag(HtmlHelper helper, string type, string id) 
    { 
     this.writer = helper.ViewContext.Writer; 
     this.builder = new TagBuilder("script"); 
     this.builder.MergeAttribute("type", type); 
     this.builder.MergeAttribute("id", id); 
     writer.WriteLine(this.builder.ToString(TagRenderMode.StartTag)); 
    } 

    public void Dispose() 
    { 
     writer.WriteLine(this.builder.ToString(TagRenderMode.EndTag)); 
    } 
} 
+0

これは最高の、最もエレガントな答え。それは投票されるべきです。 – adoss

0

別のWebフォームソリューションではなく、私はすべての私の他のページが継承するBasePageクラスクラスの内部でこれらの二つの機能をドロップ:

私のaspxで次に
Public Function Template(ByVal id As String) As String 
    ' the type attribute does not matter as long as it's not "text/javascript" 
    Return "<script id='" + id + "' type='text/template'>" 
End Function 

Public Function Template() As String 
    Return "</script>" 
End Function 

<%= Template("templateID")%> 
    ... your template code goes here ... 
<%= Template()%>