簡體   English   中英

如何將 2 個變量從 jquery AJAX 傳遞給 ASP.Net WebApi2 方法?

[英]How to pass 2 variables from jquery AJAX to ASP.Net WebApi2 method?

我可以寫一個 JQuery AJAX 對 webapi2 (asp.net) controller 的調用,只有 1 個參數就好了(一個 json 對象),但是當嘗試發送 2 個參數(一個字符串和一個整數)到一個調用時,其他所有參數都保留一樣,我明白了

找不到與請求 URI 匹配的 HTTP 資源

瀏覽器控制台中的錯誤。 我相信我已經嘗試了所有我能想到的組合來傳遞 2 個參數,但總是以相同的錯誤消息結束:我不確定數據的正確格式,在 javascript - 我以為我做了一個JSON object。但沒有,我已經引用、未引用並嘗試了我能想到的每一種組合。 但沒有快樂。 ASP?Net WebAPI2 不接受超過 1 個參數,(我正在將 ASMX 從舊站點轉換為 api 控制器,並且卡在 1 個采用 2 個參數的特定控制器上 - 適用於 ASMX。但 webapi 似乎無法識別簽名)。

C# 中的 web 方法(我試過 post、put 和 delete 動詞——不開心)

    [Route("api/DeleteUserSearch")]
    [HttpPost]
    [Authorize(Roles = "admin,paid,vendor,visitor")]
    public async Task<IHttpActionResult> DeleteUserSearch(string userid, int usersearchidx)
    {
        int retval = 0;
        if (IsValidUserId(userid))
        {
            retval = (await userSearch_Data.DeleteSavedSearchAsync(userid, usersearchidx)).xToInt();
        }
        return Ok(retval);
    }

AJAX 電話:(一個與 ASMX 一起工作的版本)

function deleteUserSearch(uid, sid) {
$.ajax({
    url: '../../api/DeleteUserSearch',
    dataType: 'json',
    method: 'post',
    data: { userid:  uid , usersearchidx : sid },
    success: function (data) {
        //refresh searches dropdown
        ShowSuccessMsg('Your search has been deleted.');
        $('#SSPopup').modal('hide');
        RetrieveSearchesDD(uid, "#ddlSavedSearches", false, "")
    },
    error: function (err) {
        console.log('Error (deleteUserSearch): ' + JSON.stringify(err, null, 2));
    }
});
};

這適用於具有 1 個參數(任何對象)的所有其他調用,但不適用於多個參數。 我在這里做錯了什么?

控制台中的完整錯誤:(這顯然是一個簽名問題 - URI 是正確的)。

Error (deleteUserSearch): {
  "readyState": 4,
  "responseText": "{\"Message\":\"No HTTP resource was found that matches the request URI 'https://localhost:44371/api/DeleteUserSearch'.\",\"MessageDetail\":\"No action was found on the controller 'SavedSearches' that matches the request.\"}",
  "responseJSON": {
    "Message": "No HTTP resource was found that matches the request URI 'https://localhost:44371/api/DeleteUserSearch'.",
    "MessageDetail": "No action was found on the controller 'SavedSearches' that matches the request."
  },
  "status": 404,
  "statusText": "error"
}

解決方案1

從表單中獲取數據作為一個 object 和一個參數

當您將數據作為 object 傳遞時,例如{ userid: uid, usersearchidx: sid }您需要對ControllerAction進行一些更改

public class Parameter { public int UserId { get; set; } public int UserSearchIdX { get; set; } } public async Task<IHttpActionResult> DeleteUserSearch([FromForm] Parameter param) { // Your code }

解決方案2

分別獲取數據作為兩個參數

如果不能對舊代碼改動太多,想分別獲取兩個參數,那么可以這樣: 你的API沒有變化:

function deleteUserSearch(uid, sid) {
  $.ajax({
    url: '../../api/DeleteUserSearch?userId=' + uid + '&userSearchIdX=' + sid,
    dataType: 'json',
    method: 'post',
    //data: { userid: uid, usersearchidx: sid },
    success: function (data) {
        alert("Success");
    },
    error: function (err) {
        console.log('Error');
    }
  });
}

您可以像查詢字符串一樣發送參數:

 function deleteUserSearch(uid, sid) { $.ajax({ url: '../../api/DeleteUserSearch?userId=' + uid + '&userSearchIdX=' + sid, dataType: 'json', method: 'post', //data: { userid: uid, usersearchidx: sid }, success: function (data) { alert("Success"); }, error: function (err) { console.log('Error'); } }); }

好的。 明白了。 WebApi 只能處理一個參數,但它可以是任何東西(一個對象)。 因為這是 DotNetFW 4.72,[Form] 裝飾器不起作用(僅限 DotNetCore),所以我想我只是在 Javascript 中創建一個 JSON object 並將其與 C# 中的 object 匹配。

(我有一個名為 UserSearch 的類/模型,其屬性為 UserId 和 UserSearch_Idx)

所以工作版本代碼如下:

    [Route("api/DeleteUserSearch")]
    [HttpDelete]
    [Authorize(Roles = "admin,paid,vendor,visitor")]
    public async Task<IHttpActionResult> DeleteUserSearch(UserSearch p)
    {
        int retval = 0;
        if (IsValidUserId(p.UserId))
        {
            retval = (await userSearch_Data.DeleteSavedSearchAsync(p.UserId, p.UserSearch_Idx)).xToInt();
        }
        return Ok(retval);
    }

在客戶端,它很簡單:只需創建一個 JSON object 並為其分配屬性。 那一端的代碼如下所示:

function deleteUserSearch(uid, sid) {
    var uSearch = {};
    uSearch.UserId = uid;
    uSearch.UserSearch_Idx = sid;

    $.ajax({
        url: '../../api/DeleteUserSearch',
        dataType: 'json',
        method: 'delete',
        data: uSearch,
        success: function (data) {
            //refresh searches dropdown
            ShowSuccessMsg('Your search has been deleted.');
            $('#SSPopup').modal('hide');
            RetrieveSearchesDD(uid, "#ddlSavedSearches", false, "")
        },
        error: function (err) {
            console.log('Error (deleteUserSearch): ' + JSON.stringify(err, null, 2));
        }
    });
};

謝謝 Saeid 的提示(Core 有一個內置的 object 表示表單數據 - 這很好)!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM