Подтвердить что ты не робот

VS2010 IntelliSense внутри текста /x -jquery-tmpl script шаблоны

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 4

Если вы используете 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 в зависимости от того, из чего состоят ваши шаблоны)

Ответ 5

Другое решение WebForms, не столь тщательное или элегантное, как Rusted solution, но я отбрасываю эти две функции внутри класса BasePage, из которого наследуются все мои другие страницы:

Public Function Template(ByVal id As String) As String
    ' the type attribute does not matter as long as it 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()%>