iT邦幫忙

0

asp.net web api post用ajax接不到值

  • 分享至 

  • twitterImage

想請問各位大大
我用asp.net framework web api寫了一支測試api
但是當我用ajax去呼叫後端一直收到不值 一直是null 參考了很多stackoverflow文章都無法有效的解決
想請問各位這應該是哪裡寫錯了呢

[RoutePrefix("api/Test")]
public class TestController : ApiController
{
    [HttpPost]
    [Route("Book")]
    public string Book([FromBody] string test)
    {
        return test;
    }
}
<script>
$.ajax({
    url: "/api/Test/Book",
    method:"POST",
    contentType: "application/json",
    data: JSON.stringify({ "test": "test123" }),
    beforeSend: function () {
        //
    },
    complete: function () {
        //
    }
}).done(function (data) {
    console.log("成功取得" + data);
}).fail(function (jqXHR, textStatus) {
    console.log("發生錯誤: " + textStatus);
})
Homura iT邦高手 1 級 ‧ 2021-07-16 13:36:14 檢舉
JSON.stringify不要用
直接丟物件試試
不行再把fromBody拿掉
Mikey iT邦新手 5 級 ‧ 2021-07-19 09:49:00 檢舉
我後來測試是fromBody的問題,fromBody必須要宣告class才能使用
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
緯大啊緯大人
iT邦研究生 1 級 ‧ 2021-07-16 13:23:36

我不確定對不對~
但我認為這邊參數名稱應該要相同,你可以試試

var test=JSON.stringify({ "test": "test123" });


$.ajax({
    url: "/api/Test/Book",
    method:"POST",
    contentType: "application/json",
    data: test,
    beforeSend: function () {
        //
    },
    complete: function () {
        //
    }
}).done(function (data) {
    console.log("成功取得" + data);
}).fail(function (jqXHR, textStatus) {
    console.log("發生錯誤: " + textStatus);
})

Mikey iT邦新手 5 級 ‧ 2021-07-16 13:32:16 檢舉

剛剛嘗試了還是沒辦法,但是如果我用class包起來這樣就可以,不要用到FromBody的話

我沒有嘗試過frombody這部分,所以不清楚他到底影響了什麼,正常來說這寫法,接收沒什麼問題才是~ 關鍵應該在這詞

Mikey iT邦新手 5 級 ‧ 2021-07-19 09:49:18 檢舉

好的 非常謝謝您!:)

0
japhenchen
iT邦超人 1 級 ‧ 2021-07-16 13:43:10

我都用 $.post 不要直接用底層的 $.ajax
直接 data:{}不用stringify啦

function GetAutoComplete(t) {
    $.post({
            url: './',
            dataType: 'json',
            data: {
                action: "getAutoComplete",
                value: $("#tbName").val()
            }
        })
        .done(function(data) {
            if (data !== null && data.length > 0) {
                acKeyword = data;
                $("#tbName").autocomplete("option", { source: acKeyword });
            }
        });
}

善用F12開發人員工具來除錯,"網路"那XHR標籤很好用

如果你只是要接收純文字而不是json,那dataType: 'html'或 'text'就好

Mikey iT邦新手 5 級 ‧ 2021-07-19 09:49:56 檢舉

很謝謝您對我的回覆,目前測試是frombody產生了影響,必須要宣告class來接值才能使用!BestRegards!

0
天黑
iT邦研究生 5 級 ‧ 2021-07-16 17:09:38

[FromBody] 本身解析方式比較特別,專門解析複雜型態的,如果要帶參數還是盡量使用 model,
前端直接帶字串應該就能有資料,附上POSTMAN測試,這樣傳遞限制很大只有一個參數,微軟參考文件也會附上

https://ithelp.ithome.com.tw/upload/images/20210716/20138525eomTOyCXUC.png

微軟文章參考

Mikey iT邦新手 5 級 ‧ 2021-07-19 09:50:46 檢舉

非常感謝您對我的回覆 目前也發現是FROMBODY的問題!感謝您!BestRegards!

0
微笑
iT邦研究生 5 級 ‧ 2021-07-22 15:58:25

body是存字串的話推薦可以用object
這種寫法比較不會有打不到api的狀況

[RoutePrefix("api/Test")]
public class TestController : ApiController
{
    [HttpPost]
    [Route("Book")]
    public string Book(object test)
    {
        return test;
    }
}

我要發表回答

立即登入回答