2011-01-24 3 views
20

Tôi đã sử dụng các mẫu jQuery mà tôi hoàn toàn thích sử dụng. Hạn chế duy nhất từ ​​quan điểm IDE là thiếu HTML IntelliSense bên trong thẻ script. Có cách nào để đánh lừa VS2010 để đánh dấu bên trong thẻ script mẫu có được IntelliSense và làm nổi bật cú pháp?VS2010 IntelliSense bên trong các mẫu tập lệnh văn bản/x-jquery-tmpl

+0

bạn đang sử dụng ASP.NET MVC bởi cơ hội nào? –

+0

Điều này dường như được sửa trong VS2012 – Keith

Trả lời

3

Tôi không nghĩ bạn có thể trừ khi bạn lừa trình chỉnh sửa không biết bạn đang viết một thẻ tập lệnh, như viết nó bằng mã (trình trợ giúp HTML hoặc như vậy). Tôi sẽ làm việc xung quanh nó bằng cách thay đổi tên thẻ (hoặc bình luận nó) tạm thời và đưa nó trở lại sau khi tôi đã hoàn tất. Chắc chắn đó là một giải pháp ngớ ngẩn.

Một việc khác bạn có thể làm là thay vì sử dụng thẻ script, hãy sử dụng bất kỳ thẻ nào khác như div cài đặt style thành display:none. Nó sẽ hoạt động chính xác theo cùng một cách (ví dụ ở giữa this article).

+0

Xin chào Mohamed, cảm ơn đây chính xác là những gì tôi đang tìm kiếm. – Bob

+0

Bạn rất hoan nghênh. Vì vậy, bạn có thể đánh dấu câu trả lời nếu đó là câu trả lời đúng cho câu hỏi? Cảm ơn rất nhiều. – Meligy

+0

hiển thị nó dưới dạng div ẩn có thể có các hiệu ứng phụ khi trình duyệt sau đó sẽ phân tích nội dung.giải pháp khác là để có chúng trong một tập tin riêng biệt và loại bỏ các thẻ script từ tập tin. sau đó kết xuất các thẻ script từ bên ngoài thông qua httphandler hoặc mã. – Mrchief

3

Nếu bạn đang sử dụng MVC bạn có thể thực hiện một phương pháp khuyến nông cho người HtmlHelper như thế này:

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

Sử dụng như

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

Bạn sẽ nhận được màu cú pháp đầy đủ và Intellisense theo cách đó. (Tuy nhiên, VS có thể cảnh báo về lồng không hợp lệ của các yếu tố html tùy thuộc vào những gì các mẫu của bạn bao gồm)

4

tôi đã giải quyết vấn đề này bằng cách tạo điều khiển tùy chỉnh serverside đơn giản (đối với ứng dụng ASP.NET WebForms 4.):

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

} 

và đưa từng mẫu jquery bên trong nó (thay vì <script> tag):

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

sẽ trả lại nó trong HTML như:

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

Tôi tạo ra một phương pháp helper cho ASP.NET MVC 3 mà làm việc như thế này, lấy cảm hứng từ Html.BeginForm:

trong tầm nhìn:

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

Bất cứ điều gì trong phạm vi @using sẽ được cú pháp nổi bật .

Mã cho helper:

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

Đây là tốt nhất, câu trả lời thanh lịch nhất. Nó sẽ được bình chọn. – adoss

0

Một giải pháp WebForms, không phải là triệt để hay thanh lịch như giải pháp gỉ, nhưng tôi thả hai chức năng bên trong của một lớp BasePage mà từ đó tất cả các trang khác của tôi kế thừa:

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 

Sau đó, trong aspx của tôi:

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