无法将变量从JQuery AJAX传递到C#代码后面

时间:2012-03-28 16:00:44

标签: c# jquery ajax json

不确定我做错了什么,但我无法通过JQuery AJAX调用来正确传递变量。它收到它就好了。我可能会忽视一些小事。感谢。

(另外,有没有办法以这种方式传递数据而不使用[WebMethod]或通过URL?)

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <script src="Scripts/jquery-1.7.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function() {   
            $('#button').click(function(){
            var json_obj = "{'" + $('#t1').val() + "' : '" + $('#p1').val() + "', '" + $('#t2').val() + "' : '" + $('#p2').val() + "'}";

                $.ajax({
                    type: "POST",
                    url: 'Default.aspx/test',
                    contentType: 'application/json; charset=utf-8',
                    data: "thisisatest",//json_obj,
                    dataType: 'json',
                    success: function(msg) {
                    //$('#result').html(msg.d);
                        alert(msg.d)
                    },
                    error: function(msg) {
                    //$('#result').html(msg.d);
                        alert(msg.d + " err")
                    }
                });
            });
        });
    </script>
</head>
<body>
    <div>
        Type: 1: <input type="text" id="t1" />
        Property 1: <input type="text" id="p1" />
        <br /><br />
        Type 2: <input type="text" id="t2" />
        Property 2: <input type="text" id="p2" />
        <input type="button" value="Add object!" id="button" />
        <br /><br />
        <div id="result"></div>
    </div>
</body>
</html>

背后的代码

    [WebMethod]
    public string test(string json)
    { 
        return json;
    }

3 个答案:

答案 0 :(得分:2)

WebMethods必须是静态的!

http://encosia.com/why-do-aspnet-ajax-page-methods-have-to-be-static/

[WebMethod]
public static string test(string json)
{ 
   return json;
}

并且您的JSON输入应为:

var jsonInput = { 'json': 'XXXXXXX'};

其中'json'等于webmethod参数的名称

并在Ajax函数中

data:JSON.stringify(jsonInput)

答案 1 :(得分:2)

以下是我为您撰写的完整示例,用于说明这一概念:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Web.Services" %>
<script type="text/C#" runat="server">

    public class MyModel
    {
        public string T1 { get; set; }
        public string P1 { get; set; }
        public string T2 { get; set; }
        public string P2 { get; set; }
    }

    [WebMethod]
    public static string Test(MyModel obj)
    {
        return "Hello from test";
    }
</script>

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    Type: 1: <input type="text" id="t1" />
    Property 1: <input type="text" id="p1" />
    <br /><br />
    Type 2: <input type="text" id="t2" />
    Property 2: <input type="text" id="p2" />
    <input type="button" value="Add object!" id="button" />
    <br /><br />
    <div id="result"></div>

    <script src="scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        $('#button').click(function () {
            var data = JSON.stringify({
                obj: {
                    t1: $('#t1').val(),
                    p1: $('#p1').val(),
                    t2: $('#t2').val(),
                    p2: $('#p2').val()
                }
            });
            $.ajax({
                url: 'default.aspx/test',
                type: 'POST',
                contentType: 'application/json',
                data: data,
                success: function(result) {
                    $('#result').html(result.d);
                }
            });
            return false;
        });
    </script>
</body>
</html>

我在这里混合了同一个Default.aspx文件中的代码和标记,但显然如果您愿意,可以将它们分开。

答案 2 :(得分:1)

您可以将方法更改为GET,并将值附加到URL,如此...

$.ajax({
     type: "GET",
     url: 'Default.aspx/test?json=' + 'thisisatest',
     contentType: 'application/json; charset=utf-8',
     success: function(msg) {
          //$('#result').html(msg.d);
          alert(msg.d)
     },
     error: function(msg) {
          //$('#result').html(msg.d);
          alert(msg.d + " err")
     }
});

然后在你的代码后面......

protected void Page_Load(object sender, EventArgs e)
{
     Response.ContentType = "application/json; charset=utf-8";
     Response.Write(Request["json"]);
}

如果你打算走这条路,我建议不要使用Code Behinds,因为他们必须处理整个ASP.NET Web窗体页面生命周期。你最好使用ASP.NET处理程序(ashx)。

祝你好运!