簡體   English   中英

asp.net 4.5 Web窗體不引人注意的驗證jQuery問題

[英]asp.net 4.5 Web Forms Unobtrusive Validation jQuery Issue

我一直在查看4.5中Web Forms的一些新功能,而且我遇到了一個不顯眼的驗證路障。

Web Forms 4.5中的不顯眼驗證依賴於jQuery,當它啟用時,將在頁面主體中的服務器表單內部生成jQuery腳本引用。 這聽起來很棒,我喜歡這個概念。 它在我看過的演示中效果很好,代碼中的減少/清理是一件很美妙的事情。

然而,當我在預先存在的項目中啟用它時,我遇到了問題。 問題是我有無數的頁面和應用程序利用jQuery進行客戶端交互(jQuery UI是一個典型的例子),在這些頁面中我有一個jQuery引用和附帶的代碼在頁面的標題部分。 當啟用不顯眼的驗證時,結果是頁面上的第二個jQuery引用,並且標題中的javascript中斷。

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

不幸的是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)。

正如Damian Edwards所說 ,你似乎無法刪除引用,因此我使用的解決方案是創建一個虛假的jQuery引用,指向一個空的JS文件。 這仍然會在嘗試加載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"
        });
    }
}

是的,您可以使用scriptmanager注冊腳本引用(name = jquery),這將告訴不顯眼的驗證系統jquery已注冊,並且由於您自己呈現腳本,它將全部工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM