【问题标题】:asp.net 4.5 Web Forms Unobtrusive Validation jQuery Issueasp.net 4.5 Web 表单不显眼的验证 jQuery 问题
【发布时间】:2012-08-17 09:51:11
【问题描述】:

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

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

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

有没有办法让我告诉脚本管理器 jQuery 已经加载到页面中,这样就不会添加第二个引用?或者,我有没有办法告诉脚本管理器或 Web 窗体框架检查页面是否存在现有的 jQuery 引用?

【问题讨论】:

    标签: jquery asp.net webforms asp.net-4.5


    【解决方案1】:

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

    【讨论】:

    • 感谢您的建议,当您发布它时,我完全错过了它。再看看 4.5 的一些特性。我尝试了您的建议,在 Firefox、Chrome 和 IE 中进行了测试,每个结果都是相同的 - 由于第二个 jquery 引用,标头脚本中断。看起来如果不对我的 webforms 应用程序进行重大修改,我将无法使用不显眼的验证。我很想找到一种方法来覆盖这种行为。这可以在网络表单的更新中实现吗?还是我们需要等待下一个版本的 asp.net?
    • 我只是想澄清一下,因为我上面的评论具有误导性。 Damian,您的解决方案完美运行(我之前的评论来自您发布的早期方法)。我一直在应用程序中使用它,它解决了我的问题。我仍然希望在未来版本的 WebForms 中看到一个内置的解决方案,但取而代之的是,非常感谢您的解决方法。
    【解决方案2】:

    作为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"
            });
        }
    }
    

    【讨论】:

    • 我喜欢这个,因为它一次性解决了问题。
    【解决方案3】:

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

    【讨论】:

    • 您将如何添加这样的参考?当我在标记中添加它时,我仍然得到错误。如果我在 global.asax 中添加一个,我必须指定一个路径...
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多