[英]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.