Я использую шаблоны jQuery, которые я абсолютно люблю использовать. Единственным недостатком с точки зрения IDE является отсутствие HTML IntelliSense внутри тега script. Есть ли способ обмануть VS2010, чтобы разметка внутри шаблона script получала IntelliSense и подсветку синтаксиса?
VS2010 IntelliSense внутри текста /x -jquery-tmpl script шаблоны
Ответ 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()%>