基本的...
現在の MVC プロジェクトで行っていることは次のとおりです。
Telerik の Web Asset Manager を使用して、すべてのページで使用されることがわかっているすべての共通スクリプトと CSS をマスター ページに登録します(私のように、あなたが知らなかった場合は、オープン ソースのダウンロードがあります)。
すべての JS 機能 (数行以上) を、適切な外部 JS ファイルに格納された関数にカプセル化します。
拡張された UI 機能のすべてを HTML ヘルパーにカプセル化します。次に、StyleSheetRegistrar と ScriptsRegistrar を使用して、その特定のヘルパーに必要な追加の CSS または JS を動的に読み込みます。そして、Telerik マネージャーがそれらを複数回ロードしないようにしてください。
インライン スタイルを使用する場合は、ヘルパー メソッド内で htmlAttributes オブジェクトを介して手動でスタイル タグを指定しますが、これはまれです。
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 ファイルを動的にロードできるようにするために、すべての 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>