2012-08-22 11 views
5

Webフォームの4.5の新機能のいくつかをチェックしていますが、私は目立たない検証で道路ブロックに入りました。asp.net 4.5 Webフォーム邪魔されない検証jQueryの問題

Web Forms 4.5の妥協のない検証はjQueryに依存し、有効にすると、ページ本体のサーバーフォーム内にjQueryスクリプトの参照が生成されます。これは素晴らしく、コンセプトが大好きです。私が見てきたデモではうまく動作し、コードの縮小/クリーンアップは美しいものです。

しかし、私は以前のプロジェクトにこれを有効にすると問題にぶつかります。問題は、クライアントサイドのインタラクション(jQuery UIは典型的な例)のためにjQueryを利用する無数のページとアプリケーションがあり、これらのページではjQueryリファレンスと付随するコードがページのヘッダセクションにあることです。控えめな検証が有効な場合、結果はページ上の2番目のjQuery参照であり、ヘッダ内のjavascriptは改行されます。

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

答えて

0

はい、あなたはスクリプトを自分でレンダリングされているので、これにより、次に、それはすべての作業

ますjqueryのが登録されている控えめな検証システムを伝えるとなりますのScriptManagerでスクリプトリファレンス(名前= jqueryの)を登録することができます

+0

このような参照をどのように追加しますか?私はマークアップでそれを追加すると、私はまだエラーが発生します。 global.asaxに1つ追加すると、パスを指定する必要があります。 – Lodewijk

8

残念ながら、ScriptResourceMappingが必要です。しかし、少しの作業で、ScriptManagerから参照を削除できるので、jQueryを再度レンダリングすることはありません。

WebプロジェクトでのScriptManagerから派生する独自のクラスを作成します。ASP.NETカスタムのScriptManager代わりの1でを使用するように、あなたのweb.configファイル内tagMappingエントリを構成し、

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

次へボックス:

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

これはそれです。これで、ScriptManagerがレンダリングロジックを開始する前にすべてのjQueryリファレンスが削除され、UnobtrusiveValidationのすべての要件が満たされます(ページのタグでjQueryを参照していると仮定します)。

+0

あなたの提案をお寄せいただき、ありがとうございました。ちょうど4.5の機能のいくつかをもう一度見てみましょう。私はあなたの提案を試してみました.Firefox、Chrome、IEでテストされており、それぞれの結果は同じです。ヘッダースクリプトは2番目のjqueryリファレンスのために中断します。私は私のwebformsのアプリに大きな改訂なしで控えめな検証を使用することができないように見えます。私はこの振る舞いを無効にする方法を見つけるのが大好きです。これはwebformsへのアップデートで可能ですか?または、asp.netの次のバージョンを待つ必要がありますか? – John

+0

上記の私のコメントが誤解を招くため、明確にしたいだけです。 Damian、あなたのソリューションは完璧に機能します(私の前のコメントはあなたが投稿した以前のアプローチからのものでした)。私はアプリケーションでそれを使用していて、私の問題を解決しました。私はまだWebFormsの将来のバージョンでこれのための組み込みのソリューションを見たいと思っていますが、その代わりに、あなたの回避策は高く評価されています。 – John

7

Damian Edwards saidとして参照を削除するように見えないので、私が行った解決策は、空の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" 
     }); 
    } 
} 
+0

かなりですが、トリック、ありがとう! – Colin

+0

問題は1つの場所で1つの場所に固定されるので、このようにします。 – Cesar

関連する問題