Чтобы избавить вас от проблем с AJAX, вы можете использовать старые грязные приемы.
Сначала добавьте скрытое поле формы и скрытый iframe в код .aspx:
<input type="hidden" name="Send" value="0" />
<iframe name="SendFrame" style="display: none;"></iframe>
Во-вторых, имейтетакой код JS вместо этого:
if(newState == 1)
{
document.forms[0].elements["Send"].value = "1";
document.forms[0].target = "SendFrame";
document.forms[0].submit();
document.getElementById("counter").innerHTML = ++n;
}
И, наконец, в вашем коде C # есть это в методе Page_Load
:
if (Request.Form["Send"] == "1")
send();
Редактировать: сначала какое-то объяснение.Приведенный выше код изменяет форму target , заставляя его отправляться в скрытый фрейм вместо текущей страницы, что является поведением по умолчанию.Это приводит к «AJAX-подобному» результату без использования «настоящего» AJAX.Зачем?Потому что данные отправляются из браузера на сервер, когда пользователь ничего не видит и без перезагрузки страницы.Это то, что я делал до того, как существовал AJAX.
Теперь, если вам нужно использовать PostBack на странице, он больше не будет работать, потому что форма все еще будет отправлять себя во фрейм, чтобы данные были "потерял".Решение - вернуть цель назад, так как ее изменение сразу после отправки формы может вызвать проблемы. Таймер - это лучший способ для ИМО, а пересмотренный код:
if(newState == 1)
{
document.forms[0].elements["Send"].value = "1";
document.forms[0].target = "SendFrame";
document.forms[0].submit();
window.setTimeout(function() { document.forms[0].target = ""; }, 1000);
document.getElementById("counter").innerHTML = ++n;
}
Это вернет цель к пустомучерез одну секунду, позволяя в то же время отправить форму на скрытый фрейм.
Наконец вы спрашиваете: «Почему старый трюк, а не новый?»Потому что это будет работать без использования каких-либо дополнительных библиотек кода.Он такой же кроссбраузерный, как и любые современные решения AJAX.Идеальным решением вашей проблемы было бы предложить вам включить jQuery в ваш код, тогда пересмотренный код будет только таким:
if(newState == 1)
{
$.post(document.forms[0].action, { "Send": "1" });
document.getElementById("counter").innerHTML = ++n;
}
и иметь тот же код на стороне сервера.Лично я не думаю, что вам нужно включать целую библиотеку jQuery только для этого, это все равно, что покупать емкость для воды 5 л, когда вам нужен только один стакан - но это, конечно, ваш выбор.:)
Редактировать II: Относительно .ashx
это стандартный способ «слушать» такие вещи, как то, что мы делаем здесь: вместо публикации «Отправить» на той же странице идеальным способом является отправка.ashx
слушатель и есть код отправки почты там.Если хотите, прочитайте этот урок , который выглядит превосходно, и возвращайтесь, когда будете готовы к большему.;)