Я провел 4 дня, пытаясь сделать ajax-звонок на мой .aspx.cs. В лучшем случае я получил ответ в формате html. Я не понимаю, почему это произошло, может быть, я должен добавить какую-то либу из NuGet или написать что-то в web.config?
Что я пробовал:
Что я хочу получить:
Мое приложение имитирует торговый автомат. Пользователь нажимает на кнопки с монетами, и монеты должны увеличиваться на стороне сервера. (BtnAddCoin()) Также на панели всегда отображаются монеты пользователя. (ShowInsertedCoins())
ClientSide.aspx
<%@ Page Language = "C#" AutoEventWireup = "true" CodeBehind = "ClientSide.aspx.cs" Inherits = "VendingMachine.ClientSide" Async = "true" AsyncTimeout = "60" %>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml">
<head runat = "server">
<link rel = "stylesheet" href = "StyleSheet.css" />
<title></title>
<script src = "https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script type = "text/javascript">
function AddCoin(coin) {
alert(coin);
var val1 = coin;
$.ajax({
type: "POST",
url: "/ClientSide.aspx/BtnAddCoin",
data: '{coin: "' + coin + '" }',
dataType: "text",
success: function (data) {
alert("AddCoin" + data);
},
error: function (req, status, error) {
alert(error + status);
}
}).done(function (result) { ShowInsertedCoin(); });
}
function ShowInsertedCoin() {
var insertedCoins = document.getElementById('InsertedCoins');
alert('ShowInsertedCoin');
$.ajax({
type: "GET",
url: "/ClientSide.aspx/ShowInsertedCoins",
dataType: "text",
data: {},
success: function (data) {
alert("ShowInsertedCoin " + data);
insertedCoins.textContent = data;
}
});
}
</script>
</head>
<body>
<form id = "form1" runat = "server">
</form>
<div>
<h1>Coffee machine</h1>
</div>
<div>
<div>
<p> Add coins: </p>
<div>
<div>
<a id = "coin1" onclick = "AddCoin(1)"> 1 </a>
<a> 2 </a>
<a> 5 </a>
<a> 10 </a>
</div>
</div>
<div>
<p id = "InsertedCoins" ><%=ShowInsertedCoins()%> </p>
</div>
</div>
</div>
</body>
</html>
ClientSide.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace VendingMachine
{
public partial class ClientSide : System.Web.UI.Page
{
static int coins = 10;
protected void Page_Load(object sender, EventArgs e)
{
}
[WebMethod]
public static string ShowInsertedCoins()
{
return "You inserted: " + coins.ToString();
}
[WebMethod]
public void BtnAddCoin(int coin)
{
coins = +coin;
//ShowInsertedCoins();
}
}
}
Итак, как я могу сделать ajax-вызов .aspx.cs с помощью jQuery или js?
Почему я получаю формат html, когда моя функция должна возвращать строку?
Спасибо за внимание и помощь.
@ gunr2171 jQuery никогда не бывает достаточно ...
честно говоря, я вижу, что есть так много способов делать ajax-вызовы, но не могу понять, что лучше, какие новые технологии на данный момент?
Предполагая, что jQuery будет делать публикацию формы, возможно, изменение '{coin: "' + coin + '" }' на {coin: coin } может сработать. Если веб-метод будет отображать входящие переменные формы в аргументы, то есть.
Отвечает ли это на ваш вопрос? ASP.NET jQuery Ajax вызывает метод кода программной части
Вы не определили BtnAddCode как возвращающее что-либо, поэтому ASP.NET просто возвращает HTML-код, связанный с ClientSide.aspx. Пусть BtnAddCode возвращает что-то, кроме текста или HTML (например, объект, массив, список и т. д.), и он вернет это, вероятно, сериализованное как JSON или XML.





Как уже прокомментировали другие люди, рекомендуется использовать более новые технологии, отличные от веб-форм, но если вы хотите продолжать использовать их, или это проект вашей работы или что-то связанное, вот как я обычно делаю в Javascript:
$.ajax({
method: "POST",
url: "ClientSide.aspx/BtnAddCoin",
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify({
obj: JSON.stringify(data)
}),
success: function (response) {
let return = JSON.stringify(response.d);
// something
},
error: function (ex) {
// something
console.info(ex.Message)
},
beforeSend: function () {
// something
},
complete: function () {
// somethin
}
});
И для файла C# каждый раз, когда вы хотите создать веб-метод, этот метод должен быть общедоступным и статическим, точно так же (по крайней мере, я узнал, что каждый раз должен быть статическим):
[WebMethod]
public static string BtnAddCoin(int newCoin)
{
return newCoin;
}
Попробуйте и посмотрите, поможет ли это
Здесь много проблем.
Первая проблема?
У вас есть это статическое значение для класса страницы:
static int coins = 10;
Вы не можете реально контролировать, использовать или иметь статические значения в классе. ГЛАВНАЯ причина в том, что такие значения будут применяться ко всем пользователям сайта, а не только к одному пользователю.
Как правило, вы можете вызывать, использовать и потреблять статические классы. На самом деле в vb.net мы ЧАСТО создаем модуль, а внутри у нас есть множество вспомогательных подпрограмм и подпрограмм, которые мы свободно называем этой библиотекой кода. Хотя каждая из подпрограмм может свободно использовать локальные значения, вы НЕ МОЖЕТЕ использовать переменные, глобальные для этого модуля, поскольку экземпляр класса не создается, и в результате несколько пользователей смогут/могут установить такие значения - и перезаписать значения, используемые другими пользователями. Что еще хуже, как долго сервер сохраняет такие статические значения?
Ответ: это полная авантюра в Лас-Вегасе.
это означает, что для сохранения этого количества монет мы можем выбрать один из МНОГИХ возможных способов сохранения этого значения.
У нас может быть глобальная переменная JavaScript, содержащая значение.
Мы можем использовать элемент управления, например текстовое поле, для хранения значения (и скрытия его).
Мы можем использовать скрытый элемент управления (так ViewState будет хранить значение).
Мы можем использовать ViewState непосредственно для хранения значения (сохранение на стороне клиента), но управляется кодом на стороне сервера.
Мы можем использовать session() для хранения значения (сохранение на стороне сервера)
На протяжении многих лет мы видим «много» попыток передать, разделить, сохранить значения данных в статическом классе. Иногда это работает, и часто во время разработки «кажется» работать, но в момент развертывания на реальном рабочем сайте он взрывается огромным огненным шаром.
Итак, использование статического класса для хранения кода Ходжа? Конечно, нет проблем, и именно это мы делаем в С#, чтобы получить общий «модуль кода» подпрограмм, которые нам нужны во всем приложении. Но быть ли модулем vb.net или в С# статическим классом? Любая концепция глобальных значений для этого статического класса ДОЛЖНА быть исключена из таблицы и НЕ использоваться!!
Итак, давайте приготовим рабочий пример. Сначала мы должны выбрать место/место для удержания и сохранения нашего количества монет.
Хм, у нас есть много вариантов. Однако, поскольку этот пример кода включает код на стороне сервера. Тогда давайте использовать сеанс.
Я имею в виду, что весь этот пример провалится, если мы напишем код на 100% клиентском JavaScript (что не так уж и плохо). Однако, поскольку мы пытаемся учиться и использовать веб-метод?
Затем давайте подключим это, используя веб-метод. (как уже отмечалось, здесь нам действительно не нужно использовать какой-либо серверный код).
Итак, если мы собираемся использовать session() для сохранения значения, то при загрузке первой страницы мы устанавливаем счетчик монет с начальным значением 10.
Кроме того, КОГДА вы используете/вызываете/используете веб-метод страницы? НЕ существует экземпляра класса страницы. В результате ВСЕ веб-методы должны быть статическими. На самом деле это означает, что на самом деле все равно, разместили ли мы веб-метод на текущей странице, в каком-то файле ascx или где-то еще. Поскольку веб-страница НЕ отправляется обратно на сервер, то все элементы управления, значения и вещи на этой веб-странице ВСЕ ЕЩЕ находятся на вашем рабочем столе, и на стороне сервера нет копии веб-страницы.
Следующий:
data: '{coin: "' + coin + '" }',
dataType: "text",
Итак, у вас есть данные о Джейсоне, но в следующей строке вы говорите, что мы собираемся использовать текст? Неа!!! Если вы собираетесь передать json-данные методу, он вернет такие json-данные обратно. То же самое происходит, если вы выбираете xml или что-то еще.
Итак, вы не можете передавать данные json, но тогда в следующей строке мы будем использовать текст!!!!!
Итак, наш код на стороне сервера теперь выглядит следующим образом:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// setup starting coin count
Session["CoinCount"] = (int)0;
}
}
[WebMethod(enableSession: true)]
public static void BtnAddCoin(int coin)
{
int MyCoins = (int)HttpContext.Current.Session["CoinCount"];
MyCoins += coin;
HttpContext.Current.Session["CoinCount"] = MyCoins;
Debug.Print("coins = " + MyCoins.ToString());
}
[WebMethod(enableSession: true)]
public static string ShowInsertedCoins()
{
int MyCoins = (int)HttpContext.Current.Session["CoinCount"];
return "You inserted: " + MyCoins.ToString();
}
Теперь, для клиентской стороны, ЗАМЕТИТЕ, что при использовании формата json возвращаемое значение/результаты относятся к свойству ".d" веб-метода. Это вещь asp.net, и именно так она и работает.
Итак, теперь наш клиентский код;
<div>
<div>
<p>Add coins: </p>
<div>
<div>
<a id = "coin1" onclick = "AddCoin(1)">1 </a>
<a>2 </a>
<a>5 </a>
<a>10 </a>
</div>
</div>
<div>
<p id = "InsertedCoins"></p>
</div>
</div>
</div>
<script>
function AddCoin(coin) {
$.ajax({
type: "POST",
url: "/CoinCount.aspx/BtnAddCoin",
data: JSON.stringify({ coin: coin }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function () {
// alert("AddCoin" + data);
ShowInsertedCoin();
},
error: function (req, status, error) {
alert("x" + error + status);
}
}).done(function (result) { ShowInsertedCoin(); });
}
function ShowInsertedCoin() {
var insertedCoins = $('#InsertedCoins');
$.ajax({
type: "POST",
url: "CoinCount.aspx/ShowInsertedCoins",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: {},
success: function (data) {
insertedCoins.text(data.d);
}
});
}
</script>
Следующий?
Как «form2» попал на эту страницу?
Если вы создаете новую страницу aspx (веб-формы), то последние gazillion страниц по умолчанию будут иметь форму form1 и БОЛЬШОЙ флаг, что у вас есть form2 здесь.
В любом случае вышеописанное должно работать. Обратите внимание, что вы не только отправляете данные json, но вам, как правило, нужно добавить тип контента, и у вас его не было:
contentType: "application/json; charset=utf-8",
Кроме того, до сих пор мы только добавили событие щелчка для «1», и вы должны сделать то же самое для других 3 значений, которые у вас есть.
Большое спасибо за ваш подробный ответ! Мне помогло, теперь у меня работает ajax вызов, и я лучше разбираюсь в теме. Спасибо!
Возможно, вы захотите рассмотреть возможность использования более новых технологий. На данный момент веб-формы и jQuery довольно устарели.