数组值从 JS 丢失到控制器

Posted

技术标签:

【中文标题】数组值从 JS 丢失到控制器【英文标题】:Array Values Are Lost From JS To Controller 【发布时间】:2020-03-04 12:15:18 【问题描述】:

我正在尝试将数组值从我的 javascript 传递到我的 C# 控制器。我使用 console.log();并验证在 JavaScript 方面的值是否完全符合预期。

但是,当我在控制器端 (C#) 添加断点时 - 它显示 updateData: Count = 0。为什么我要从有结果的 JavaScript 转到没有结果的 C#?

$('#UpdateDB').click(function () 
    console.log(JSON.stringify( updateData: updateData ));
    $.ajax('https://localhost:44328/api/DBUpdate', 
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data:  updateData: updateData ,
        dataType: "json",
        success: function (r) 
            alert("save successfully!");
        
    );
);
[Route("api/DBUpdate")]
public ActionResult UpdateDB(List<TLSModel> updateData)

    return Json(new  status = "success", message = "Records saved successfully" );

编辑 这就是我的 TLSModel 的样子

public class TLSModel

  [Key]
  public int ID  get; set; 
  public double StoreNumber  get; set; 
  public string StoreName  get; set; 
  public bool ActiveStore  get; set; 

【问题讨论】:

只要传入ajax data:JSON.stringify( updateData: updateData ) @jishansiddique - 同样的问题。当它碰到我的控制器时,计数 = 0。 【参考方案1】:

问题是模型绑定器需要一个列表,而查看您的 cmets 您正在发送一个具有列表属性的对象。只发送数组就可以了。

这是一个有效的例子。

var updateData = [ storeNumber: "2059", activeStore: false ,  storeNumber: "2005", activeStore: false ];

$('#UpdateDB').click(function ()       
    $.ajax('https://localhost:44328/api/DBUpdate', 
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(updateData),
        dataType: "json",
        success: function (r) 
            alert("save successfully!");
        
    );
);

【讨论】:

【参考方案2】:

尝试检查您的数据类型以获取此函数的参数:

public ActionResult UpdateDB(List<TLSModel> updateData)

List&lt;TLSModel&gt; 可能无法正确匹配/映射到您传递给 C# 的模型。

试试Array&lt;TLSModel&gt;

如果确实在 C# 代码中遇到了断点,那么路由就没有问题,所以这是一个好的开始。

我会尝试看看你是否可以将该 updateData 对象传递给任何控制器函数,然后看看如果你只将一个字符串传递给任何控制器函数会发生什么,这可能有助于缩小范围。

【讨论】:

这是我的 console.log();我是否以错误的格式发送它? "arraCheck":["storeNumber":"2059","activeStore":false,"storeNumber":"2005","activeStore":false] @JamesL 您应该将发布的内容作为模型添加到您的问题中。这很可能是问题所在。另外,请确保它与发布的内容完全相同,而不是对数据的解释。 @CPerson - 你的意思是 console.log() 产生了什么? 如果我将它转换为 Array 我得到这个编译错误The Non-Generic Type Array can not be used with type arguments【参考方案3】:

你确认updateData是JS中的数组了吗?

否则在您的 ajax 帖子中尝试

data:  updateData: [updateData] 

【讨论】:

这是我的 console.log();我是否以错误的格式发送它? "arraCheck":["storeNumber":"2059","activeStore":false,"storeNumber":"2005","activeStore":false] 您发送的型号在我看来是错误的。尝试发送这个而不是 updateData 变量:var tlsArray = [ ID: 0, StoreNumber: 12, StoreName: 'name', ActiveStore: true , ID: 1, StoreNumber: 13, StoreName: 'name2', ActiveStore:真]; 如果我更改我的 updateDB 按钮中的数据,点击读取像这样data: "arraCheck": [ "storeNumber": "2059", "activeStore": false , "storeNumber": "2005", "activeStore": false ] , 当我在我的控制器代码中击中断点时它仍然为空 arraCheck 从何而来?使用我的输出inspelad。应该工作【参考方案4】:

也许这会有所帮助:

https://dotnetfiddle.net/cGay3Y

虽然我注意到我的示例中的数组对象看起来像这样:

["storeNumber":"2059","activeStore":false,"storeNumber":"2059","activeStore":false]

【讨论】:

我将控制器方法更改为像这样UpdateDB(TLSModel[] updateData) - 但仍然是同样的问题,当我将鼠标悬停在控制器中的 updateData 上时,它显示 Count = 0...当我到达我的控制器代码时,我将如何迭代 updateData 以确认它包含的数据? 您是否尝试在我的示例中复制确切的代码(全部),看看是否至少有效(意思是,count 不为 0)?

以上是关于数组值从 JS 丢失到控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 codeigniter 中,如何将数组值从控制器传递到同一视图页面?

在角度js中将值从一个控件传递到另一个控件[重复]

如何使用范围变量将值从控制器获取到指令中

Ruby如何将值从单选按钮传递到控制器方法

Codeigniter - 发布到控制器时附加的数组项目丢失

如何使用 ajax 传递 from.serialize() 和数组值?