asp.net 4.5 Web窗体不引人注意的验证jQuery问题

时间:2012-08-22 01:27:16

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

我一直在查看4.5中Web Forms的一些新功能,而且我遇到了一个不显眼的验证路障。

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

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

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

3 个答案:

答案 0 :(得分: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&# 39; s tag)。

答案 1 :(得分:7)

作为Damian Edwards said,您似乎无法删除引用,因此我使用的解决方案是创建一个指向空JS文件的虚假jQuery引用。这仍然会在尝试加载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"
        });
    }
}

答案 2 :(得分:0)

是的,您可以使用scriptmanager注册脚本引用(name = jquery),这将告诉不显眼的验证系统jquery已注册,并且由于您自己呈现脚本,它将全部工作