asp.net 4.5 Ненавязчивая проверка веб-форм Вопрос jQuery
Я проверял некоторые из новых функций для веб-форм в 4.5, и я столкнулся с дорожным блоком с ненавязчивой проверкой.
Ненавязчивая проверка в Web Forms 4.5 зависит от jQuery, и при ее включении ссылка на скрипт jQuery будет внутри формы сервера в теле страницы. Это звучит великолепно, и я люблю эту концепцию. Он прекрасно работает в демонстрационных программах, на которые я смотрел, и сокращение / очистка кода - прекрасная вещь.
Однако я сталкиваюсь с проблемами, когда включаю это в уже существующих проектах. Проблема в том, что у меня есть бесчисленные страницы и приложения, которые используют jQuery для взаимодействия на стороне клиента (типичным примером является пользовательский интерфейс jQuery), и на этих страницах у меня есть ссылка на jQuery и сопровождающий код в разделе заголовка страницы. Когда ненавязчивая проверка включена, результатом является вторая ссылка jQuery на странице, и javascript в заголовке разрывается.
Есть ли способ для меня, чтобы сказать диспетчеру сценариев, что jQuery уже был загружен на страницу, чтобы вторая ссылка не была добавлена? В качестве альтернативы, есть ли способ сообщить менеджеру сценариев или инфраструктуре веб-форм проверить страницу на наличие ссылки на jQuery?
3 ответа
Как сказал Дамиан Эдвардс, вы не можете удалить ссылку, поэтому я решил создать поддельную ссылку jQuery, которая указывает на пустой файл JS. Это все равно создаст неизбежный дополнительный тег сценария при попытке загрузить jQuery, но это не будет реальной библиотекой jQuery, поэтому не будет конфликта со ссылкой на jQuery в вашем теге head.
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"
});
}
}
К сожалению, ScriptResourceMapping не требуется. Однако, немного поработав, вы можете удалить ссылку из ScriptManager, чтобы он больше не отображал jQuery.
Создайте свой собственный класс, производный от 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);
}
}
}
}
}
Затем настройте запись tagMapping в вашем файле web.config, чтобы 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 в теге вашей страницы).
Да, вы можете зарегистрировать ссылку на скрипт (name=jquery) с помощью scriptmanager, который будет опрашивать ненавязчивую систему проверки, что jquery зарегистрирован, и, поскольку вы выполняете сценарии самостоятельно, все будет работать