Вот отличное современное решение для загрузки асинхронного скрипта, хотя оно адресовано только сценарию js с асинхронным ложным.
Существует большая статья, написанная на www.html5rocks.com - Глубокое погружение в мутные воды загрузки скрипта .
После рассмотрения многих возможных решений, автор пришел к выводу, что добавление js-скриптов в конец элемента body является наилучшим способом избежать блокировки отображения страницы с помощью js-скриптов.
В то же время автор добавил другое хорошее альтернативное решение для тех людей, которые отчаянно пытаются загрузить и выполнить сценарии асинхронно.
Учитывая, что у вас есть четыре сценария с именем script1.js, script2.js, script3.js, script4.js
, вы можете сделать это с помощью async = false:
[
'script1.js',
'script2.js',
'script3.js',
'script4.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
Теперь, Spec говорит: Скачайте вместе, выполните в порядке как скоро как вся загрузка.
Firefox & lt; 3.6, Opera говорит: я понятия не имею, что это за «асинхронная» вещь, но это так происходит. Я запускаю скрипты, добавленные через JS, в том порядке, в котором они добавлены.
Safari 5.0 говорит: «Я понимаю», async ", но не понимают, что он устанавливает значение" false "с помощью JS. Я буду выполнять ваши скрипты, как только они приземлятся, в любом порядке.
IE & lt; 10 говорит: «Не знаю, как« асинхронно », но есть обходное решение, использующее« onreadystatechange ».
Все остальное говорит:« Я твой друг, мы сделаем это по книге ».
Теперь полный код с IE & lt; 10:
var scripts = [
'script1.js',
'script2.js',
'script3.js',
'script4.js'
];
var src;
var script;
var pendingScripts = [];
var firstScript = document.scripts[0];
// Watch scripts load in IE
function stateChange() {
// Execute as many scripts in order as we can
var pendingScript;
while (pendingScripts[0] && ( pendingScripts[0].readyState == 'loaded' || pendingScripts[0].readyState == 'complete' ) ) {
pendingScript = pendingScripts.shift();
// avoid future loading events from this script (eg, if src changes)
pendingScript.onreadystatechange = null;
// can't just appendChild, old IE bug if element isn't closed
firstScript.parentNode.insertBefore(pendingScript, firstScript);
}
}
// loop through our script urls
while (src = scripts.shift()) {
if ('async' in firstScript) { // modern browsers
script = document.createElement('script');
script.async = false;
script.src = src;
document.head.appendChild(script);
}
else if (firstScript.readyState) { // IE<10
// create a script and add it to our todo pile
script = document.createElement('script');
pendingScripts.push(script);
// listen for state changes
script.onreadystatechange = stateChange;
// must set src AFTER adding onreadystatechange listener
// else we’ll miss the loaded event for cached scripts
script.src = src;
}
else { // fall back to defer
document.write('
Проверка подлинности XSS включена в MVC по умолчанию. Таким образом, вам не нужно ограничивать ввод HTML (он уже ограничен), вместо этого вы разрешаете ввод HTML только для определенных свойств Actions или ViewModel, которые вы отметили.
Настройка атрибута [ValidateInput(false)]
в действии будет отключить проверку на все действие.
Атрибут [AllowHtml]
в свойстве ViewModel позволяет вводить только HTML-данные для этого свойства. Это рекомендуемый способ включения ввода HTML.
Чтобы решить вашу проблему, вы должны удалить [ValidateInput(false)]
из своего действия.
Дальнейшее чтение: Предотвращение атак XSS в ASP.NET MVC с использованием ValidateInput и AllowHTML .
Также убедитесь, что вы настроили правильный requestValidationMode
в своем web.config. requestValidationMode 4.5 vs 2.0 .
Чтобы предоставить настраиваемое сообщение об ошибке, если проверка входных данных завершилась неудачно, зарегистрируйте IExceptionFilter
в Global.asax, который проверяет, выбрано ли исключение HttpRequestValidationException
.
public class HttpRequestValidationExceptionFilter : FilterAttribute, IExceptionFilter {
public const int MySpecialStatusCodeIndicatingValidationError = 1337;
public void OnException(ExceptionContext filterContext) {
if (!filterContext.ExceptionHandled && filterContext.Exception is HttpRequestValidationException) {
// redirect to error controller, which shows custom message
filterContext.Result = new HttpStatusCodeResult(MySpecialStatusCodeIndicatingValidationError);
filterContext.ExceptionHandled = true;
}
}
}
Для возможного механизма обработки ошибок с помощью специальных кодов состояния см. Обработка ошибок ASP.NET MVC 404 . Идея состоит в распознавании MySpecialStatusCodeIndicatingValidationError
и перенаправлении на правильное действие в пользовательском HttpErrorController
.