2

.aspx および .ascx ファイルを として読み込んでいますStreamReader

各ファイルに、JavaScript とスタイルシートの依存関係を<%@ ClientDependency path="~/Scripts/jquery-1.4.1.min.js" %>.

そのようなことを行うための既存の規則はありますか? 実装は必要ありませんが、新しい構文を作成する方法が既にある場合は作成したくありません。

<%@また、 ASP.NET のカスタム ブロックのガイドラインは何ですか?

また、より適切な説明が思いつく場合は、この質問にタグを付け直してください。

4

3 に答える 3

1

Google ローダーなどを検討しましたか:独自のスクリプトで ASP.NET Ajax スクリプト ローダーを有効にする

于 2011-03-10T04:15:53.473 に答える
0

クライアントインクルードをディレクティブに登録するための既存の規則はありません。私の解決策は、代わりにカスタムサーバーコントロールを作成し、既存のTemplateParser機能を使用してインクルードデータを取得することでした(これは、ファイルをストリームとしてロードして自分で解析するよりも望ましい結果になりました)。

于 2011-03-11T21:12:43.447 に答える
0

基本的...

現在の 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>
于 2011-03-10T18:05:28.767 に答える