[英]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 對象同步,並確保數據類型兼容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.