文本/ x-jquery-tmpl脚本模板中的VS2010 IntelliSense

时间:2011-01-24 21:29:05

标签: jquery html visual-studio-2010 intellisense

我一直在使用jQuery模板,我非常喜欢使用它。 IDE观点的唯一缺点是脚本标记内缺少HTML IntelliSense。有没有办法愚弄VS2010,以便模板脚本标签内的标记获得IntelliSense和语法高亮?

5 个答案:

答案 0 :(得分:6)

我为ASP.NET MVC 3创建了一个帮助方法,其工作方式与此类似,受Html.BeginForm的启发:

在视图中

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

@using范围内的任何内容都将突出显示语法。

帮助者的代码:

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

答案 1 :(得分:4)

我通过创建简单的自定义服务器端控件(适用于ASP.NET 4 WebForms应用程序)解决了这个问题:

[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();          
    }

}

并将每个jquery模板放入其中(而不是<script>标记):

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

将在HTML中呈现为:

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

答案 2 :(得分:3)

我不认为你可以,除非你欺骗编辑器不知道你正在写一个脚本标签,比如在代码中编写它(HTML帮助器等)。我会通过暂时更改标签名称(或评论它)并在完成后将其恢复来解决它。当然这是一个愚蠢的解决方案。

您可以做的另一件事是使用script之类的其他标记,而不是使用div标记,将style设置为display:none。它应该以完全相同的方式工作(例如在this article中间。)

答案 3 :(得分:3)

如果你正在使用MVC,你可以像这样为HtmlHelper创建一个扩展方法:

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());
     }
}

使用

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

你将获得完整的语法着色和intellisense。 (但是,VS可能会警告html元素的无效嵌套,具体取决于模板的组成)

答案 4 :(得分:0)

另一个WebForms解决方案,不像Rusted的解决方案那样彻底或优雅,但我将这两个函数放在一个BasePage类中,其他所有页面都继承该类:

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

然后在我的aspx中:

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