簡體   English   中英

AJAX 調用正在向控制器操作發送空數據

[英]AJAX call is sending null data to controller action

我目前正在使用 ASP.NET Core、HTML 和 Javascript 編寫網站。 目前,我有一個網站頁面,其中加載了設備和統計數據圖表。 圖表下方是一個區域,用戶可以在其中選擇要查看其詳細信息的特定設備。 然后將此信息發送到控制器,控制器將有關它們的信息返回給視圖。

然而,雖然我知道當我用斷點查看 AJAX 調用時確實會轉到控制器,並且我知道我選擇的設備的值已更正,但它總是向控制器返回一個“空”字符串值,我不不知道為什么。

根據我在 SO 上看到的代碼,我嘗試了幾種不同的編寫方式。 我的代碼與此頁面上的代碼相似(從結構上講)。 我嘗試了解決方案,這是我現在擁有的代碼,但它似乎沒有改變任何東西。

這是我當前的 javascript 代碼:

function filterInterventions() {


        var equipment = $(".equipmentCheckboxes:checkbox:checked").map(function () {
            return this.value;
        }).get();




        $("#IntrvTable tbody tr").remove();


        $.ajax({

            type: "GET",

            data: equipment,
            cache: false,


            //url: "GiveData?jsonString=",
            url: '@Url.Action("GiveData")',
            success: function (data) {
                if (data) {
                    alert("success");
                    var parent = $("#parent");
                    parent.empty();
                    parent.append(data);
                }
            }
        });
    }

這是我的控制器代碼:

public ActionResult GiveData(string jsonString){
    //do stuff....
    return View("RawData", myModel);
}

當我在瀏覽器和 IDE 中逐步執行它時,我知道實際 javascript 中的設備是正確的。 例如,如果我選擇設備 'AA' 和 'BB' 來查看,我知道我發送的是 ["AA/", "BB/"]。 但是我無法將控制器操作中的“jsonString”設為非空。

我認為這可能是因為我正在發送一個數組,但是我在網上找到的關於打開傳統的東西沒有幫助。 我會喜歡任何幫助。 謝謝。

我相信你要找的是:

data: { 'jsonString': JSON.stringify(equipment) }

通常,雖然 JSON 將用於對象而不是字符串數組,但方法簽名將反映作為 POCO 類傳遞的數據的對象定義。 如果你只想要一個數組,那么這樣的事情應該可以工作:

data: { 'equipment' : equipment }

帶有控制器動作簽名: public ActionResult GiveData(string[] equipment)

編輯:JSON/POCO 示例

對於典型的 JSON 示例,假設您有一個表示編輯新訂單或現有訂單的視圖模型。 這可能有訂單 ID、訂單日期、客戶 ID、送貨地址詳細信息和訂單行列表。 (產品 ID,數量)在客戶端,您將為數據構建一個 JS 對象視圖模型,然后將其組合為 JSON,如下所示:

{
  "order": {
       "orderId": 1234,
       "orderDate": "2019-07-21",
       "customerId": 216,
       "deliveryAddress": {
            "street": "216 Cuckoo Crescent"
            "city": "Sydney"
       }
       "orderLines": {
            { "productId": 22, "quantity":1 },
            { "productId": 15, "quantity":3 }
       }
    }
}

Ajax 調用數據組件如下所示:

data: { 'order': orderJson }

如果訂單數據只是一個 Javascript 對象,那么您將使用JSON.stringify(order)來傳遞 JSON 表示。

在您的服務器中,您將定義這些視圖模型:

[Serializable]
public class OrderViewModel
{
    public int? OrderId { get; set; }
    public DateTime OrderDate { get; set; }
    public int CustomerId { get; set; }

    public AddressViewModel Address { get; set;}
    public ICollection<OrderLineViewModel> OrderLines { get; set; } = new List<OrderLineViewModel>();
}

[Serializable]
public class AddressViewModel
{
    public string Street { get; set; }
    public string City { get; set; }
    // ...
}

[Serializable]
public class OrderLineViewModel
{
    public int ProductId { get; set; }
    public int Quantity { get; set; }
}

在您的方法簽名中,您希望: public ActionResult CreateOrder(OrderViewModel order)

ASP.Net 將接受 JSON 對象,您的代碼可以自動使用 POCO 類。 這是從內存中提取的,並且可能需要/涉及具有某些屬性優勢或額外步驟的 JSON.Net 之類的庫,因此可能需要進行一些調整和配置,尤其是為了適應 JS 和 C# 代碼之間的 Pascal 與 Camel 大小寫約定。 開發人員有責任保持 POCO 定義和 JS 對象同步,並確保數據類型兼容。

它現在是默認行為 - 將原始數據映射到純字符串。

與映射到字符串不同,它通常是一種更好的方法 - 將 JSON 映射到相應的類類型。

如果原始數據是目標 - 可能是您正在尋找的東西。

暫無
暫無

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

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