0

我有几天时间阅读并寻找这个问题的答案,但我没有找到。

我正在使用此代码

$('#Button1').click(function () {
            $.ajax({
                type: "POST",
                url: "/Default.aspx/ServerSideMethod",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async: true,
                cache: false,
            })
            return false;
        });
        });

尝试调用 C# 方法

[WebMethod]
 public void ServerSideMethod() {//Do something}

但我找不到任何有效的解决方案....

4

5 回答 5

3

要使其正常工作,请确保设置的方法位置url正确,并且该方法 is publicand staticthat is[WebMethod]添加了一个属性,例如:

[WebMethod]
public static void doAll()
{
    //do something
}

如果url是“/Default.aspx/ServerSideMethod”,那么您的方法应该如下所示:

[WebMethod]
public static void ServerSideMethod()
{
    //do something
}
于 2013-11-01T12:50:16.163 回答
1

在js中试试这个:

$('#Button1').click(function () {
        // this calls default.aspx 
        $.ajax({
            type: "POST",
            url: '/Default.aspx',
            data: "{ServerSideMethod : '1'}", // send a parameter, to tell it what we want
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            cache: false,
            function(data){
                // data is json sent from server, if not, try $.parseJSON(data)
                // do something here after the server side code has finished
                if(data.ok){
                    //success from server side
                }
            }  
        });
        return false;
    });
    });

在 Default.aspx.cs 中:

    // fires anytime default.aspx is loaded
    protected void Page_Load(object sender, EventArgs e)
    {
        // check if is ajax call and not normal page load in the browser
        if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
        {
             Response.Clear();  //empty everithing so we don't send mixed content
             // no cache on ajax, IE caches ajas if this is missing
             Response.Cache.SetExpires(DateTime.Today.AddMilliseconds(1.0));
             Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
             // here we are checking what we want to do, what client side asked
             if(!string.IsNullOrWhiteSpace(Request["ServerSideMethod"])) // this will be "1"
             {
                  doAll(); // do your work
             }
             Response.End();
        }
    }

    private void doAll() 
    {
            // do work, then send some json, as this is what you expect         
            // JavaScriptSerializer is located in System.Web.Script.Serialization
            Response.Write(new JavaScriptSerializer().Serialize(new { ok = 1, error = 0 }));
    }
于 2013-11-01T13:00:01.963 回答
0

如果您想从 ajax 调用非静态方法,我建议您创建一个Web 服务并从 javascript 调用它。您可以在 Web 服务中使用非静态方法。

Stackoverflow 中有很多关于如何从 javascript 调用 Web 服务的示例。 从 JavaScript 调用 ASP.NET Web 服务方法

于 2013-11-01T14:02:12.960 回答
0

首先,我建议您编写一些调试语句。在 doAll() 的第一行写一些输出。它实际上会让您知道您是否真的将请求从​​浏览器发送到您的服务器。我的意思是如果有任何链接到您的服务器在url: "/Default.aspx/ServerSideMethod",. 我在想您正在执行 ajax 调用,但您根本没有启动服务器,或者没有将此 URL 链接到您的方法的侦听器。

于 2013-11-01T12:50:52.353 回答
-1

asp.net 标记

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>


</head>
<body>
    <form id="form1" runat="server">
    <%--
     you can remove dropdown if asp.net Render __doPostBack already for You.
    --%>
    <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True">
        <asp:ListItem>1</asp:ListItem>
        <asp:ListItem>2</asp:ListItem>
    </asp:DropDownList>

    <input type="button" value="Click Me" onclick="__doPostBack('CallFromJavaScript','Message from JavaScript')" />

    </form>
</body>
</html>

和代码背后。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack)
            {
                string funcationName = Request.Params["__EVENTTARGET"];
                string org = Request.Params["__EVENTARGUMENT"];
                if (funcationName == "CallFromJavaScript")
                {
                    CallFromJavaScript(org);
                }
            }
        }


        protected void CallFromJavaScript(string Data)
        {
            Response.Write(DateTime.Now);
        }


    }
}

可能是这个技巧对你的帮助

于 2013-11-01T14:34:04.527 回答