VS2010 IntelliSense внутри текстовых / x-jquery-tmpl шаблонов скриптов - PullRequest
20 голосов
/ 25 января 2011

Я использую шаблоны jQuery, которые я очень люблю использовать. Единственным недостатком с точки зрения IDE является отсутствие HTML IntelliSense внутри тега script. Есть ли способ обмануть VS2010, чтобы разметка внутри тегов сценария шаблона получала IntelliSense и подсветку синтаксиса?

Ответы [ 5 ]

6 голосов
/ 30 января 2012

Я создал вспомогательный метод для 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));
    }
}
4 голосов
/ 20 октября 2011

Я решил эту проблему, создав простой пользовательский серверный элемент управления (для приложения 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>
3 голосов
/ 08 октября 2011

Если вы используете 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>)

Вы получите полную окраску синтаксиса и интеллигентность таким образом. (хотя VS может предупредить о неправильном вложении html-элементов в зависимости от того, из чего состоят ваши шаблоны)

3 голосов
/ 22 февраля 2011

Я не думаю, что вы можете, если вы не обманываете редактора, чтобы он не знал, что вы пишете тег сценария, например, пишете его в коде (помощник HTML или около того). Я бы обошел его, временно изменив имя тега (или прокомментировав его) и вернув его после завершения работы. Конечно, это глупое решение.

Еще одна вещь, которую вы можете сделать, это вместо использования тега script, использовать любой другой тег, например div, установив для style значение display:none. Он должен работать точно так же (пример в середине этой статьи ).

0 голосов
/ 17 апреля 2013

Другое решение 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()%>
...