В принципе, дисперсия применяется, когда CLR может гарантировать, что ей не нужно делать какие-либо репрезентативные изменения к значениям. Все ссылки одинаковы, поэтому вы можете использовать IEnumerable
как IEnumerable
без каких-либо изменений в представлении; сам собственный код не обязательно должен знать, что вы делаете со значениями, если инфраструктура гарантировала, что он определенно будет действительным.
Для типов значений, которые не work - для обработки IEnumerable
как IEnumerable
, код, использующий последовательность, должен был бы знать, следует ли выполнять преобразование бокса или нет.
Возможно, вы захотите прочитать блог Эрика Липперта пост по представлению и идентичности для более подробной информации по этой теме в целом.
EDIT: перечитав сообщение блога Эрика, это как минимум примерно тождество как представление, хотя эти два связаны. В частности:
Вот почему ковариантные и контравариантные преобразования интерфейса и типов делегатов требуют, чтобы все переменные аргументы типа были ссылочными типами. Чтобы гарантировать, что вариантное преобразование ссылок всегда сохраняется с сохранением идентичности, все преобразования, связанные с аргументами типа, также должны сохраняться в идентичности. Самый простой способ гарантировать, что все нетривиальные преобразования в аргументах типа сохраняют сохранение идентичности, - это ограничение их ссылок на ссылки.
Решение было довольно простым и включало добавление и установку async в false в .ajax (). Кроме того, я переработал код для работы кнопки отправки, а затем передал форму, когда AJAX успешно прошел.
Вот мой рабочий код:
$(document).ready(function() {
var testing = false;
$('#btn-login').on('click', function() {
$.ajax({
url: $('form').attr('action'),
type: 'post',
data: $('form').serialize(),
async: false,
success: function(data) {
if (data == 'true')
{
testing = true;
$('form').attr('action', 'https://example.com');
$('form').submit();
}
else
{
alert('Your username/password are incorrect');
}
},
error: function() {
alert('There has been an error, please alert us immediately');
}
});
return testing;
});
});
В одной строке вы используете $('form')
, чтобы выбрать форму для изменения своего действия, но затем вы используете $(this)
, чтобы попытаться выбрать ту же форму. Я бы предположил, что функция this
внутри функции обратного вызова - это не то, что вы ожидаете от нее, и это нечто иное, чем ваша форма (возможно, объект window
).
Просто соедините вызовы:
$('form').attr('action', 'http://example.com').unbind('submit').submit();
Неправильная практика выбора всех тегов формы в вашем коде, что, если на странице есть несколько форм? Также вам лучше использовать .on()
и .off()
с jQuery.
$(document).ready(function() {
$('form').on('submit', function(e) {
e.preventDefault();
// cache the current form so you make sure to only have data from this one
var form = this,
$form = $(form);
$.ajax({
url: form.action,
type: form.method,
data: $form.serialize(),
success: function(data) {
if (data == 'true')
{
$form.attr('action', 'http://example.com').off('submit').submit();
}
else
{
alert('Your username/password are incorrect');
}
},
error: function() {
alert('There has been an error, please alert us immediately');
}
});
});
});
async:false
в данном случае не имеет значения. – Kevin B 12 July 2018 в 15:23