[英]ASP.NET Directive Convention for Declaring Client-Side Includes
我正在將.aspx和.ascx文件作為StreamReader
加載。
我希望每個文件在諸如<%@ ClientDependency path="~/Scripts/jquery-1.4.1.min.js" %>
類的聲明中注冊其javascript和樣式表依賴項。
是否存在執行此類操作的現有約定? 我不需要實現,但是如果已經有了一種新的語法,我就不想創建一個新的語法。
另外,在ASP.NET中自定義<%@
塊的准則是什么?
另外,如果您可以想到更合適的描述,請重新標記該問題。
您是否考慮過Google Loader或類似的東西: 為自己的腳本啟用ASP.NET Ajax腳本加載器
基本上...
這是我在當前的MVC項目中正在做的事情:
使用Telerik的Web Asset Manager在我知道的母版頁中注冊我所有的通用腳本和CSS,這將在每個頁面上使用(有一個開源下載,如果像我一樣,你可能不知道) 。
我將所有JS功能(除了幾行之外)封裝到存儲在適當的外部JS文件中的功能中。
我將所有擴展的UI功能都封裝到HTML Helpers中。 然后,他們使用StyleSheetRegistrar和ScriptsRegistrars動態加載該特定幫助程序所需的任何其他CSS或JS。 並且依靠Telerik管理器不要多次加載它們。
如果我曾經使用過內聯樣式,我會通過htmlAttributes對象在Helper方法內手動指定樣式標簽,但這很少見。
為了調用HTML元素上所需的javascript功能,我使用ScriptRegistrar()。OnDocumentReady()的字符串重載來指定要對該元素調用的javascript函數。
我還在HtmlHelpers類中為ScriptRegistrarBuilder定義了一個簡單的擴展方法,該方法允許我提供參數列表,以在調用OnDocumentReady()時傳遞給我的javascript方法調用,而不會產生大量字符串連接。
public static void OnDocumentReady(this ScriptRegistrarBuilder builder, string format, params string[] args) { builder.OnDocumentReady(String.Format(format, args)); }
當然,我將所有JS呈現在“母版”頁面的底部。
您不會在這里避免內聯JS的所有使用,但是如果操作正確的話,它會使它變薄。 老實說,我真的想不出另一種不會變得復雜的方法。
最后,我認為您會獲得一些相當靈活的東西,同時,您可以在任何給定頁面上非常具體地加載要執行的操作和不需要的操作。
我發現此方法的唯一警告是CSS。 為了能夠在助手需要它們時將CSS文件動態加載到頁面中,我不得不在添加任何新文件的可能調用之后,將所有CSS包含內容呈現在“母版”頁面的底部。
不幸的是,尚未找到解決方法。
一個小例子
也許為您提供了不必要的詳細信息...但是通過這種方式,希望有人搜索也可以找到有用的解決方案! :)
在母版頁中:
<%
Html.Telerik().StyleSheetRegistrar().DefaultGroup(styles => styles
.Add("~/Content/Site.css")
.Add("~/Content/core.css")
);
Html.Telerik().ScriptsRegistrar().DefaultGroup(scripts => scripts
.Add("~/Scripts/common.js")
.Combine(true)
.Compress(true)
.CacheDurationInDays(30)
);
%>
然后在body結束標記上方的某處:
<%:
Html.Telerik().ScriptsRegistrar().Render();
Html.Telerik().StyleSheetsRegistrar().Render();
%>
在您的HTML幫助器中:
public static MvcHtmlString AutoCompleteComboListFor<TModel, TProperty>(this HtmlHelper<TModel> Helper, Expression<Func<TModel, TProperty>> expression,
SelectList List, string DataSource)
{
MvcHtmlString dropDown = SelectExtensions.DropDownListFor<TModel, TProperty>(Helper, expression, List);
string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
string id = Helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName);
//Do whatever you want
helper.Telerik().ScriptRegistrar().DefaultGroup(scripts => scripts
.Add("~/Scripts/extended.js")
);
helper.Telerik().StyleSheetRegistrar().DefaultGroup(styles => styles
.Add("~/Content/extended.css")
);
helper.Telerik().ScriptRegistrar().OnDocumentReady(@"MyExtendedFunction('{0}');", id);
return dropDown;
}
簡單地調用該幫助程序(或其他任何幫助程序)將在頁面末尾的整潔代碼塊中結束,其中包含所有JS代碼,文件和CSS文件。
<link type="text/css" href="/Content/Site.css" rel="stylesheet"/>
<script type="text/javascript" src="/asset.axd?id=kAAAAB-LCAAAAAAABADsvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee--997o7nU4n99__P1xmZAFs9s5K2smeIYCqyB8_fnwfPyJ-8Uezjx597xd_tPro0Uevp3WxapuPRh-d82dL-uynf9E6r6-3d8f79N9P47vqo0c7v2Qk3-bv2nw5y2f2m91f8v1f8v3RR9OWvmzp27s_nV1mDcOlBpf06d7O7s743nj33u4BfTKl3u99ep9--ehRW6_zX_L_BAAA___9S_3qkAAAAA%3d%3d"></script>
<script type="text/javascript">
//<![CDATA[
jQuery(document).ready(function(){
myFunction('Foo');});
//]]>
</script>
目前尚無用於注冊包含指令的客戶端的約定。 我的解決方案是創建一個自定義服務器控件,並使用現有的TemplateParser
功能來獲取包含數據(最終比將文件作為流加載並自行解析更可取)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.