He estado usando plantillas de jQuery que me encanta usar. El único inconveniente desde el punto de vista del IDE es la falta de HTML IntelliSense dentro de la etiqueta del script. ¿Hay alguna manera de engañar a VS2010 para que el marcado dentro de las etiquetas de script de plantilla obtenga IntelliSense y resaltado de sintaxis?
Creé un método auxiliar para ASP.NET MVC 3 que funciona así, inspirado en Html.BeginForm:
dentro de la vista:
@using (Html.BeginHtmlTemplate("templateId")) { <div>enter template here</div> }Cualquier cosa dentro del alcance de @using se resaltará sintaxis.
El código para el ayudante:
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)); } }Resolví este problema creando un control de servidor personalizado simple (para la aplicación 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(); } } y coloque cada plantilla de jquery dentro (en lugar de la etiqueta <script> ):
<some:JqueryTemplate runat="server" ID="myTemplateId"> ... your template code goes here ... </some:JqueryTemplate>lo representará en HTML como:
<script type="text/x-jquery-tmpl" id="myTemplateId"> ... your template code goes here ... </script>No creo que pueda, a menos que engañe al editor para que no sepa que está escribiendo una etiqueta de secuencia de comandos, como escribirla en código (asistente HTML más o menos). Lo solucionaría cambiando el nombre de la etiqueta (o comentándolo) temporalmente y recuperándolo una vez que haya terminado. Seguro que es una solución tonta.
Otra cosa que puede hacer es en lugar de usar una etiqueta de secuencia de script , use cualquier otra etiqueta como div configurando su style para display:none . Debería funcionar exactamente de la misma manera (ejemplo en medio de este artículo ).