繁体   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