2012-08-22 45 views
5

我一直在檢查4.5中的Web窗體的一些新功能,並且我已經運行到具有不顯眼驗證的路障中。asp.net 4.5 Web窗體不引人注目的驗證jQuery問題

Web窗體4.5中的不顯眼的驗證依賴於jQuery,並且啓用它時將導致頁面主體中服務器窗體內的jQuery腳本引用。這聽起來很棒,我喜歡這個概念。它在我看過的演示中效果很好,代碼中的減少/清除是一件很美的事情。

但是,當我在預先存在的項目中啓用此功能時,我遇到了問題。問題是我有無數頁面和應用程序利用jQuery進行客戶端交互(jQuery UI就是一個典型例子),在這些頁面中,我在頁面的標題部分有一個jQuery參考和附帶代碼。當啓用不引人注目的驗證時,結果是頁面上的第二個jQuery引用,並且標頭中的JavaScript中斷。

有沒有辦法讓我告訴腳本管理器,jQuery已經加載到頁面中,以便第二個引用不會被添加?或者,我有沒有辦法告訴腳本管理器或Web窗體框架檢查頁面是否存在現有的jQuery引用?

回答

0

是的,你可以註冊一個腳本引用(名稱= jQuery的)用的ScriptManager將inturn告訴jQuery是註冊的不顯眼的驗證系統,因爲你是渲染腳本自己它將所有的工作

+0

你會如何添加這樣的參考?當我將它添加到標記中時,我仍然收到錯誤。如果我在global.asax中添加一個,我必須指定一個路徑... – Lodewijk

8

不幸的是ScriptResourceMapping是必需的。但是,通過一些工作,您可以從ScriptManager中刪除引用,以便它不會再次呈現jQuery。

創建自己的類,從派生的ScriptManager在Web項目:

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)。

+0

感謝您的建議,當您發佈它時,我完全錯過了它。再看看4.5的一些功能。我嘗試了你的建議,在Firefox,Chrome和IE中測試過,每個結果都是一樣的 - 由於第二個jquery引用,標題腳本中斷。看起來,如果不對我的webforms應用程序進行重大修改,我將無法使用不顯眼的驗證。我很想找到一種方法來覆蓋這種行爲。這是可能的更新到webforms?或者我們需要等待下一個版本的asp.net? – John

+0

我只是想澄清一下,因爲我上面的評論是誤導性的。達米安,你的解決方案完美運作(我以前的評論來自你發佈的早期方法)。我一直在應用程序中使用它,它解決了我的問題。我仍然很喜歡在未來的WebForms版本中看到一個內置的解決方案,但代替這一點,您的解決方法非常值得讚賞。 – John

7

由於Damian Edwards said,你似乎無法刪除引用,所以我去的解決方案是創建一個假的jQuery引用,指向一個空的JS文件。這仍然會創建不可避免的額外腳本標記來嘗試加載jQuery,但它不會成爲實際的jQuery庫,因此不會與頭標記中的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

我喜歡這個,因爲它在一個地方一次性修復了問題。 – Cesar

相關問題