【问题标题】:Array Values Are Lost From JS To Controller数组值从 JS 丢失到控制器
【发布时间】: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。

标签: javascript c# jquery asp.net-mvc model-view-controller


【解决方案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)?
    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2017-10-21
    • 2014-09-13
    • 1970-01-01
    • 2016-08-31
    • 2019-08-15
    相关资源
    最近更新 更多