5

私は 4.5 の Web フォームの新機能のいくつかをチェックしてきましたが、目立たない検証で障害に遭遇しました。

Web フォーム 4.5 の控え目な検証は jQuery に依存しており、有効にすると、ページ本文のサーバー フォーム内に jQuery スクリプト参照が作成されます。これは素晴らしいですね。私はこのコンセプトが大好きです。私が見たデモではうまく機能し、コードの削減/クリーンアップは美しいものです.

ただし、既存のプロジェクトでこれを有効にすると、問題が発生します。問題は、クライアント側のやり取りに jQuery を利用するページやアプリケーションが無数にあることです (jQuery UI が典型的な例です)。これらのページでは、ページのヘッダー セクションに jQuery リファレンスと付随するコードがあります。目立たない検証が有効になっている場合、結果はページ上の 2 番目の jQuery 参照になり、ヘッダーの JavaScript が壊れます。

2 番目の参照が追加されないように、jQuery が既にページに読み込まれていることをスクリプト マネージャーに伝える方法はありますか? または、スクリプト マネージャーまたは Web フォーム フレームワークに、既存の jQuery 参照のページをチェックするように指示する方法はありますか?

4

3 に答える 3

8

残念ながら、ScriptResourceMapping が必要です。ただし、少し作業すれば、ScriptManager から参照を削除して、jQuery を再度レンダリングしないようにすることができます。

Web プロジェクトで ScriptManager から派生する独自のクラスを作成します。

using System;
using System.Linq;
using System.Web.UI;

namespace WebApplication46
{
    public class CustomScriptManager : ScriptManager
    {
        protected override void OnInit(EventArgs e)
        {
            Page.PreRenderComplete += Page_PreRenderComplete;
            base.OnInit(e);
        }

        private void Page_PreRenderComplete(object sender, EventArgs e)
        {
            var jqueryReferences = Scripts.Where(s => s.Name.Equals("jquery", StringComparison.OrdinalIgnoreCase)).ToList();
            if (jqueryReferences.Count > 0)
            {
                // Remove the jquery references as we're rendering it manually in the master page <head>
                foreach (var reference in jqueryReferences)
                {
                    Scripts.Remove(reference);
                }
            }
        }
    }
}

次に、web.config で tagMapping エントリを構成して、ASP.NET がボックス内のものではなくカスタム ScriptManager を使用するようにします。

<system.web>
  <pages>
    <tagMapping>
      <add tagType="System.Web.UI.ScriptManager" mappedTagType="WebApplication46.CustomScriptManager" />
    </tagMapping>
  </pages>
</system.web>

それでおしまい。これで、CustomScriptManager は、ScriptManager がレンダリング ロジックを開始する機会を得る前に、すべての jQuery 参照がそれ自体から削除されていることを確認し、UnobtrusiveValidation が機能するためのすべての要件を引き続き満たします (ページのタグに jQuery への参照があると仮定します)。

于 2012-09-27T18:49:21.163 に答える
7

ダミアン・エドワーズが言ったように、参照を削除することはできないようです。そのため、私が行った解決策は、空のJSファイルを指す偽のjQuery参照を作成することでした。それでも、jQueryを読み込もうとして、避けられない余分なスクリプトタグが作成されますが、実際のjQueryライブラリではないため、headタグのjQuery参照と競合することはありません。

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        ScriptManager.ScriptResourceMapping.AddDefinition("jquery", new ScriptResourceDefinition
        {
            Path = "~/Scripts/empty-file.js"
        });
    }
}
于 2012-12-31T00:59:22.537 に答える
0

はい、スクリプト参照 (name=jquery) を scriptmanager に登録できます。これにより、目立たない検証システムに jquery が登録されていることがわかります。自分でスクリプトをレンダリングしているため、すべて機能します。

于 2012-09-12T05:12:37.473 に答える