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