【问题标题】:C# MVC Ajax child listsC# MVC Ajax 子列表
【发布时间】:2018-05-02 08:52:23
【问题描述】:

我有以下设置

HTML

$.ajax({
    url: 'Transaction/updateTransaction',
    data: saveDataObject,
}).done(function (e) {
    // done
});

在“网络”标签中显示它正在发送正确的数据

查询字符串参数

key:2445
transactionDescription:Description Block
transactionToType[0][transactionToTypeKey]:1
transactionToType[0][transactionKey]:2445
transactionToType[0][transactionValue]:51.25
transactionToType[0][transactionTypeKey]:10
transactionToType[1][transactionToTypeKey]:2
transactionToType[1][transactionKey]:2445
transactionToType[1][transactionValue]:10.5
transactionToType[1][transactionTypeKey]:1

控制器

public class TransactionSave
{
    public int key { get; set; }
    public string transactionDescription { get; set; }
    public List<TransactionToTypeSave> transactionToType { get; set; }
}

public class TransactionToTypeSave
{
    public int transactionKey { get; set; }
    public int transactionToTypeKey { get; set; }
    public int transactionTypeKey { get; set; }
    public decimal transactionValue { get; set; }
}

public int updateTransaction(TransactionSave transactionSave)
{
}

在 updateTransaction 中执行断点时,我可以看到 transactionSave 具有所有数据(键和描述),并且 transactionToType 列表具有预期的两个项目,但是,这两个列表项目的所有值都是 0。

例如

key:2445
transactionDescription: Description Block
transactionToType [
    transactionToTypeKey:0
    transactionKey:0
    transactionValue:0
    transactionTypeKey:0
], [
    transactionToTypeKey:0
    transactionKey:0
    transactionValue:0
    transactionTypeKey:0
]

我在通过 ajax 传递对象内部的列表时做错了什么?

谢谢

【问题讨论】:

  • 您的集合数据需要采用transactionToType[0].transactionToTypeKey: 1 格式(属性名称周围没有括号)。但是您不应该将集合发送到 GET 方法。除了丑陋的查询字符串之外,它可能会超出查询字符串限制并抛出异常

标签: c# ajax list model-view-controller controller


【解决方案1】:

失败是因为您的 ajax 调用正在发出 GET 请求。

如果您在使用$.ajax 方法时没有指定类型property,它将进行GET 调用。对于 GET 调用,数据将作为查询字符串键值项附加到您进行 ajax 调用的 url。

当发送具有其他类型子属性的复杂对象时,您应该考虑执行 POST 请求。查询字符串有一个基于浏览器的限制。当请求为 POST 类型时,数据将在请求体中发送。

这应该可行。

var saveDataObject =
{
        key: 124,
        transactionDescription:"My desc",
        transactionToType: [{
                               transactionKey: 111,
                               transactionTypeKey: 164,
                               transactionValue:23.34
                            }
                           ]
};

$.ajax({
    type:'post',
    url: '@Url.Action("updateTransaction","Transactions")',
    contentType:"application/json",
    data: JSON.stringify(saveDataObject)
}).done(function(e) {
    console.log(e);
});

确保您使用 [HttpPost] 属性标记了您的操作方法

[System.Web.Mvc.HttpPost]
public ActionResult updateTransaction(TransactionSave transactionSave)
{
    return Json(transactionSave);
}

现在它将发送“application/json”作为 ajax 请求的 contentType 并且 js 对象的 json 字符串化版本将在请求正文中。模型绑定器将能够将发布的数据映射到您的对象

【讨论】:

  • 谢谢Shyju。我已经尝试过了,但似乎得到了相同的结果。我的网络选项卡告诉我请求方法现在已发布,我的数据正在作为表单数据传递,这似乎表明您建议的所有内容都已完成,但值仍为 0。在控制台日志中运行您的确切代码(改回url,transactionToType中的值也是0。
  • 你使用的是什么版本的 MVC?
  • 版本 4. 跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多