【问题标题】:How can I perform an ajax call to .aspx.cs如何对 .aspx.cs 执行 ajax 调用
【发布时间】:2022-10-21 19:00:35
【问题描述】:

我花了 4 天时间尝试对我的.aspx.cs 进行 ajax 调用。在最好的情况下,我得到了 html 格式的答案。我不明白为什么会这样,也许我必须从 NuGet 添加一些库或在web.config 中写一些东西? 我尝试了什么:

  • [HttpPost] [HttpGet]
  • [网络方法]
  • jQuery ajax 调用
  • 更改网址
  • 我的第一个应用程序是来自 VS 的带有 razor 页面的示例,我认为问题出在使用 razor 上,所以我创建了一个新项目 - 一个空的 Web 应用程序,但我仍然从服务器以 html 格式得到相同的答案。

我想得到什么: 我的应用程序模仿自动售货机。用户点击带有硬币的按钮,硬币必须在服务器端增加。 (BtnAddCoin()) 用户的硬币也总是显示在面板上。 (ShowInsertedCoins())

客户端.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>

客户端.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();
        }         
    }
}

那么,如何使用 jQuery 或 js 对 .aspx.cs 进行 ajax 调用? 当我的函数必须返回一个字符串时,为什么我会得到 html 格式? 感谢您的关注和帮助。

【问题讨论】:

  • 您可能需要考虑使用更新的技术。 Webforms 和 jQuery 在这一点上已经很老了。
  • @gunr2171 永远不会有足够的 jQuery ...
  • 老实说,我明白了,有很多方法可以进行 ajax 调用,但是现在不明白什么是更好的新技术?
  • 假设 jQuery 会做表单发布,也许将 '{coin: "' + coin + '" }' 更改为 {coin: coin } 可能会起作用。如果 webmethod 将传入的表单变量映射到参数,那就是。
  • 这回答了你的问题了吗? ASP.NET jQuery Ajax Calling Code-Behind Method

标签: c# asp.net ajax


【解决方案1】:

这里有很多问题。

首要问题?

您有页面类的这个静态值:

static int coins = 10;

您无法真正控制、使用或在类中拥有静态值。主要原因是这样的价值观将适用于网站的所有用户——而不仅仅是一个用户。

作为一般规则,您可以调用、使用、使用静态类。事实上,在 vb.net 中,我们经常创建一个模块,在里面我们有大量的辅助例程,以及我们可以随意调用该代码库的例程。虽然每个例程都可以自由使用本地值,但您不能使用该模块的全局变量,因为没有创建类的实例,因此,多个用户将/将能够设置此类值 - 并覆盖其他用户使用的值。更糟糕的是,服务器会保留这些静态值多久?

答:这是一场彻头彻尾的拉斯维加斯赌博。

这意味着要保持该硬币计数,我们可以选择许多可能的方法之一来保持该值。

我们可以让一个全局 JavaScript 变量保存该值。

我们可以使用像文本框这样的控件来保存值(并隐藏它)

我们可以使用隐藏控件(因此 ViewState 将保存该值)。

我们可以直接使用 ViewState 来保存值(客户端持久化),但由服务器端代码管理。

我们可以使用 session() 来保存值(服务器端持久化)

多年来,我们看到“许多”尝试在静态类中传递、共享、持久化数据值。它有时可以工作,而且通常在开发过程中它“似乎”可以工作,但是当你部署到一个真正的工作站点时,它会在一个巨大的火焰球中爆炸。

那么,使用静态类来保存一大堆代码?当然,没问题,这就是我们在 c# 中所做的,以获取我们在整个应用程序中需要的例程的通用“代码模块”。但是,是一个 vb.net 模块,还是在 c# 中是一个静态类?该静态类的任何全局值概念都必须从表中删除并且不使用!

好的,让我们编写一个工作示例。我们首先必须选择一个地方/地点来保存和保持我们的硬币计数。

嗯,我们有很多选择。但是,由于此示例代码涉及服务器端代码。然后让我们使用会话。

我的意思是,如果我们用 100% 的客户端 JavaScript 编写代码(这并不是一个坏主意),它会打败整个示例。但是,既然我们试图学习,并使用网络方法?

然后让我们使用网络方法将其连接起来。 (如前所述,我们真的不需要在这里使用任何服务器端代码)。

因此,如果我们要使用 session() 来保存值,那么在第一页加载时,我们将硬币计数设置为起始值 10。

另外,当您使用/调用/使用页面的 Web 方法时?没有页面类的实例。因此,任何和所有 Web 方法都必须是静态的。实际上,这意味着真的不在乎我们是否将 web 方法放在当前页面中,是一些 ascx 文件,还是任何地方。由于网页没有被发回服务器,因此该网页上的所有控件、值和内容仍然位于您的桌面上,并且服务器端不存在该网页的副本。

接下来:

     data: '{coin: "' + coin + '" }',
        dataType: "text",

所以,你有一些 jason 数据,但在下一行你说我们要使用文本?没有!!!如果您要向该方法传递 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 格式时,返回值/结果属于 web 方法的“.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 页面(Web 表单),那么最后的大量页面将默认具有 form1,并且您在此处拥有 form2 的 BIG 标志。

无论如何,以上应该工作。请注意,您不仅要发送 json 数据,而且通常需要添加内容类型,而您缺少以下内容:

 contentType: "application/json; charset=utf-8",

此外,到目前为止,我们只为“1”添加了一个点击事件,您必须为您拥有的其他 3 个值执行相同的操作。

【讨论】:

  • 非常感谢您的详细解答!它帮助了我,现在我有一个有效的 ajax 调用,我更好地理解了这个话题。谢谢!
【解决方案2】:

正如其他人已经评论的那样,建议使用 Webforms 以外的新技术,但如果你想继续使用它或者它是你工作的项目或相关的东西,我通常在 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.log(ex.Message)
            },
            beforeSend: function () {
                // something
            },
            complete: function () {
                // somethin
            }
        });

而对于 C# 文件,每次你想要创建一个 web 方法时,该方法都需要是公共的和静态的,就像那样(至少我知道每次都需要是静态的):

[WebMethod]
public static string BtnAddCoin(int newCoin)
{
    return newCoin;
}

试试看是否有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多