【ASP.net MVC】【WebAPI】Post的陷阱

【ASP.net MVC】【WebAPI】Post的陷阱
本篇為甚麼叫WebAPI的陷阱呢?先說明問題案例好了
小弟因為學校作業要做一個網站,為了有更好的使用者體驗,所以所有的資料傳遞都是透過Ajax以及Signalr。而問題來了,今天在做資料新增的時候,發生了一件怪事,使用Ajax所Post到API的資料都會為null,而且使用Postman傳送也都是null值
以下是小弟一開始所寫出來的WebAPI的Code

本篇為甚麼叫WebAPI的陷阱呢?先說明問題案例好了

小弟因為學校作業要做一個網站,為了有更好的使用者體驗,所以所有的資料傳遞都是透過Ajax以及Signalr。而問題來了,今天在做資料新增的時候,發生了一件怪事,使用Ajax所Post到API的資料都會為null,而且使用Postman傳送也都是null值

以下是小弟一開始所寫出來的WebAPI的Code

public HttpResponseMessage PostNewData(String Message)
 {
       var HubContext = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<SyncMessageServices>();
       HubContext.Clients.All.updateStatus(Message);
       return Request.CreateResponse(HttpStatusCode.OK);
 }

而Ajax的Code如下

$("#update").click(function () {
    $.ajax({
        url: "/api/Message",
        type: "POST",
        data:{Message:$("#status").val()}
    });
});

後來發現了一件事情,在WebAPI的POST中需要加上"[FromBody]",表示參數是來自於表單上的Body!

另外,Ajax也有些小小的問題,在data的參數中,只需要一個參數資料,就直接把參數加入就好,而有兩筆以上的參數,才需要利用"{}"來包裹參數值

經過修改的Code,來個小小記錄,希望剛好也跟我問題一樣的朋友有幫助

public HttpResponseMessage PostNewData([FromBody]String Message)
{
    var HubContext = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<SyncMessageServices>();
    HubContext.Clients.All.updateStatus(Message);
    return Request.CreateResponse(HttpStatusCode.OK);
}

----5/31更新,感謝Sky提醒----

今天sky給我一篇文章,上面說明了我們的錯誤問題,改成這樣也可以通!

$("#update").click(function () {

        $.ajax({
            url: "/api/Message",
            type: "post",
            data: {"":$("#status").val()}
        });
    });

--Old---

$("#update").click(function () {
        $.ajax({
            url: "/api/Message",
            type: "post",
            data: $("#status").val(),
            contentType: "application/json"
        });
    });

 

 


 

大家好我是饅頭,希望大家喜歡我的文章

如果有錯誤的地方請不吝指教 ^_^