asp.net 4.5 Web窗体不显眼的jQuery的验证问题(asp.net 4.5 Web F

2019-06-27 05:52发布

我已经检查出一些Web窗体中的新功能4.5,和我遇到了与不显眼的验证路障。

在网页不显眼的验证窗体4.5依赖于jQuery的,当它被允许,将会导致在页面主体的服务器形式的内部jQuery脚本参考。 这听起来很棒,我很喜欢这个概念。 它在我看过演示的伟大工程,并在代码中还原/清理是一件美好的事情。

我碰到的问题,但是,当我使这个在原先存在的项目。 的问题是,我具有利用jQuery的用于客户端交互(jQuery用户界面是一个典型的例子)无数网页和应用程序,并在这些网页我在页的标头部分一个jQuery参考和伴随的代码。 当启用不显眼的验证,结果页面上的第二jQuery的参考,并且在头断裂的JavaScript。

有没有为我的方式告诉脚本管理器的jQuery已经在页面加载,使得第二参考没有得到补充? 另外,有我的方式告诉脚本管理器或Web窗体框架来检查页面现有的jQuery的参考?

Answer 1:

不幸的是,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将确保所有的jQuery的参考都从自身取出的ScriptManager有机会开始它的渲染逻辑之前,你还是会满足所有的要求UnobtrusiveValidation工作(假设你在你的页面的标签jQuery的参考)。



Answer 2:

正如达米安·爱德华兹说 ,你似乎无法移除的参照,所以我跟去了解决方案是创建一个伪造的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"
        });
    }
}


Answer 3:

是的,你可以注册一个脚本引用(名称= jQuery的),用其中的ScriptManager将inturn告诉jQuery是注册的不显眼的验证系统,因为你是渲染脚本自己它将所有的工作



文章来源: asp.net 4.5 Web Forms Unobtrusive Validation jQuery Issue