【问题标题】:AJAX call is sending null data to controller actionAJAX 调用正在向控制器操作发送空数据
【发布时间】:2019-12-01 23:56:52
【问题描述】:

我目前正在使用 ASP.NET Core、HTML 和 Javascript 编写网站。目前,我有一个网站页面,其中加载了设备图表和统计数据。图表下方是一个区域,用户可以在其中选择要查看其详细信息的特定设备。然后将此信息发送到控制器,控制器将有关它们的信息返回给视图。

但是,虽然我知道 AJAX 调用确实会在我使用断点查看控制器时转到控制器,并且我知道我选择的设备的值已更正,但它总是向控制器返回一个“null”字符串值,并且我不知道为什么。

根据我在 SO 上看到的代码,我尝试了几种不同的编写方式。我的代码与this page 上的代码相似(从结构上讲)。我尝试了解决方案,也就是我现在拥有的代码,但它似乎没有改变任何东西。

这是我当前的 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”为非空。

我认为这可能是因为我正在发送一个数组,但是我在网上找到的关于打开传统的东西没有帮助。 我很乐意提供任何帮助。谢谢。

【问题讨论】:

  • 这里不涉及json。您正在发出 GET 请求,数据被放入 url 查询字符串中,但您没有该数据的参数名称。查看浏览器开发工具网络中使用的 url。会看到网址中没有?myParam=,因为您还没有在data中设置一个

标签: javascript c# ajax asp.net-core razor


【解决方案1】:

我相信你会寻找的是:

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 的解释以及定义如何反映在 POCO 类中?现在我基本上是在拼凑 JS/AJAX 代码来让它工作,但我希望有更深入的了解。
  • 我添加了一个带有记忆示例的编辑,以给出一个基本的想法。这有点过时了,当然还有更多最近的 ASP.Net MVC 示例,但作为一个起点:haacked.com/archive/2010/04/15/… 看看 MVC + JSON + POCO 或 ViewModel。
  • 非常感谢!这非常有用。
【解决方案2】:

现在默认行为是安静的 - 将原始数据映射到纯字符串。

与其映射到字符串,它通常是一种更好的方法 - 将 JSON 映射到相应的类类型。

如果原始数据是目标 - here 可能是您正在寻找的东西。

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多