iT邦幫忙

0

PageMethods 用ajax傳Json物件失敗

各位大大小弟正在練習ajax(為了不使用updatepanel)(VS2019)
遇到了一個難題
不知道為什麼用ajax呼叫有參數的後端function都會出現500(不管接收的參數是string、object)!https://ithelp.ithome.com.tw/upload/images/20210525/20127212C9zAk5fv8b.png
但不傳參數的話就能跑到後端(註解的public static string SayHello2())

前端

function getValues2() {
        var obj2 = new Object();
        obj2.id = $('#textbox1').val();
        var json = JSON.stringify(obj2); 
        $.ajax({
            //要用post方式   
            type: "Post",
            //方法所在頁面和方法名   
            url: "WebForm1.aspx/SayHello2",
            contentType: "application/json; charset=utf-8",
            data: json,//{id="123"}也不行
            dataType: "json",
            success: function (data) {
                //返回的數據用data.d獲取內容   
                //alert(data.d);
                console.log(data);
            },
            error: function (err) {
                alert(err);
            }
        });   
    }

後端

        [WebMethod]
		public static string SayHello2(string str2)
		//public static string SayHello2()
		{
			//obj2 weatherForecast =
			//	JsonSerializer.Deserialize<obj2>(str2);
            //return "Hello Ajax!";
			return str2+"Hello Ajax!";
		}

不用ajax傳就可以直接傳物件(但必須使用空白專案範本,用webform就會回傳整個網頁/images/emoticon/emoticon46.gif)
前端

    function getValues() {
        var text1 = $('#textbox1').val();
        var obj = new Object();
        obj.id = text1;
        PageMethods.GetValues(obj, sc, fa);
    }
    function sc(res) {
        $('#textbox1').val(res);
        console.log(res);
    }
    function fa(res)
    { alert('fail') }

後端

        public class obj
		{
			public string id;
		}
		[WebMethod]
		
		public static string GetValues(obj str)
		{
			return str.id + "test";
		}

煩請各位大大幫小弟解惑
用ajax為什麼不能傳有參數的資料(我看網路上的範例也有傳參數,照著打也是失敗)

出現error 500是網頁方面的錯誤哦

2 個回答

0
allenlwh
iT邦高手 1 級 ‧ 2021-05-25 14:07:33

您提到data: json,//{id="123"}也不行
,正確的json格式應該是

{
	"id": "123"
}
Tom831212 iT邦新手 5 級 ‧ 2021-05-25 14:29:30 檢舉

大大 我將data改為您這樣的格式還是不行耶/images/emoticon/emoticon13.gif

0
japhenchen
iT邦大師 1 級 ‧ 2021-05-25 15:27:51

會出現500的原因是你的url後面的參數用法錯了
url: "WebForm1.aspx/SayHello2",

應該是
url: "WebForm1.aspx?what=SayHello2",
(建議全用post不需並用get啦,所以aspx後面那堆sayhello2就免了吧)

改正如下

$.ajax({
    type: "Post",
    url: "WebForm1.aspx?act=SayHello2",
    data: obj2, 
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        console.log(data);
    },
    error: function (err) {
        alert(err);
    }
});   

我建議用post()且把success移出改成done跟fail

$.post({
    url : "WebForm1.aspx?act=SayHello2"
    data:obj2,
    dataType:"json"    
})
    .done(function(data){
        console.log(data);
    })
    .fail(function(err){
        console.log(err);
    })
看更多先前的回應...收起先前的回應...

data 可以直接 : obj2 不要再改json.stringify()了

Tom831212 iT邦新手 5 級 ‧ 2021-05-25 17:37:59 檢舉

感謝japhenchen大回覆
您說我用get的方是指這行嗎?

PageMethods.GetValues(obj, sc, fa);

我改用大大的寫法
他有回應,但是是Fail(他回覆整個網頁)
https://ithelp.ithome.com.tw/upload/images/20210525/201272125wcA3KvRlM.png
是因為我網頁上有ScriptManager(EnablePageMethods="true")?

Tom831212 iT邦新手 5 級 ‧ 2021-05-25 17:50:27 檢舉

大大說的>>(建議全用post不需並用get啦,所以aspx後面那堆sayhello2就免了吧)

指的是我這兩種方法都是用GET?(PageMethod、$ajax)

我自己寫API,URL幾乎都是用下面(POST)>目前範例是用webform 不知道是不是要加action跟加Post才可以/images/emoticon/emoticon20.gif
url: "WebForm1.aspx/SayHello2",

請問可以不用寫SayHello2該如何寫?

拍謝 新手什麼都不懂 還請大大解惑

action 是我猜你要post要求的命令,不是真實的情況,你的aspx要求的是什麼?

Tom831212 iT邦新手 5 級 ‧ 2021-05-26 09:05:44 檢舉

japhenchen大 我的要求是:
1.前端傳obj2(post)到後端
2.前端傳string(post)到後端反序列解析前端傳的資料
更:我已找到這兩個問題的解答 謝謝japhenchen大回覆

我要發表回答

立即登入回答