5

我一直在检查 4.5 中 Web 窗体的一些新功能,但我遇到了不显眼的验证障碍。

Web Forms 4.5 中的不显眼验证依赖于 jQuery,当启用它时,将导致页面正文中服务器表单内部的 jQuery 脚本引用。这听起来很棒,我喜欢这个概念。它在我看过的演示中效果很好,代码中的减少/清理是一件很漂亮的事情。

但是,当我在预先存在的项目中启用此功能时,我遇到了问题。问题是我有无数的页面和应用程序使用 jQuery 进行客户端交互(jQuery UI 是一个典型的例子),在这些页面中,我在页面的标题部分有一个 jQuery 参考和随附的代码。当启用不显眼的验证时,结果是页面上的第二个 jQuery 引用,并且标头中的 javascript 中断。

有没有办法让我告诉脚本管理器 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

正如Damian Edwards 所说,您似乎无法删除引用,因此我采用的解决方案是创建一个指向空 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

是的,您可以使用 scriptmanager 注册一个脚本引用(名称=jquery),这将告诉不显眼的验证系统 jquery 已注册,并且由于您自己渲染脚本,所以它会全部工作

于 2012-09-12T05:12:37.473 回答