【问题标题】:Minor trouble with AJAX POST method passing to C# MVC controller methodAJAX POST 方法传递给 C# MVC 控制器方法的小问题
【发布时间】:2015-09-13 20:40:30
【问题描述】:

大家好,stackoverflow 的居民们,我已经调试一个讨厌的 ajax POST 方法太久了,希望能得到一些意见。我有一个 JavaScript 函数,它收集一组字符串以打包并发送到我的控制器方法,但不幸的是参数数据没有被发送,我不知道为什么。

这里是JS函数:

$.ajax({
    url: 'CancelDoc',
    method: 'POST',
    datatype: 'json',
    headers: addAntiForgeryHeader(),
    data: { datakeys : DataKeys }
}).done(function (data) {
    if (data.status == 0) {
        alert("DOCUMENT CANCELLED SUCCESSFULLY");
    }
});

澄清一点:

DataKeys 是字符串数组。它应该达到这一点。 看起来像:

["1432long-crazy4297-jumbled5826string|9000|1|1|NEW", 
"1432and2-another03-jumbled1594string|9000|1|1|NEW"]

addAntiForgeryHeader() 是一种额外的客户端验证方法,我添加到所有 POST 中。问题不应该出在此处,因为我已将其注释掉以尝试调用,但它仍然没有传递数据。

C# 控制器方法:

注意:代码确实做到了这一点,但 datakeys 参数是 null

public ActionResult CancelDoc(string[] datakeys)
{
    DocObject Doc = new DocObject();
    List<string> Datakeys = datakeys.ToList();

    foreach (var dk in Datakeys)
    {
        ...
        Some model logic here (not even making it here so no worries)
        ...
    }

    return Json(new { status = 0 });
}

我试过了:

  • 以多种方式将数据转换为 JSON:ko.mapping.toJS(data)、JSON.stringify(data) 以及为此编写 JSON 对象的文字。
  • 将调用简化为最基本的形式:我尝试注释掉datatypeheaders 属性。在我发布之前,它还有几个属性。

非常感谢任何输入。

【问题讨论】:

  • 我刚刚测试了您的代码,并且数组已传递给操作。你使用的是什么版本的 MVC?我猜框架可能无法绑定参数,但它确实在最新版本的 MVC 中工作。
  • 我将您的代码粘贴到一个空白的 MVC 应用程序中,并且参数同时具有 dataKeys。当您收到 ajax 请求时,您确定 DataKeys 已填充?
  • 对我来说似乎很重要。所以,你确实尝试过 data : {dataKeys: JSON.stringify(dataKeys)} ?
  • @Dev-One 好的,我错过了那个。事实证明,只有DataKeys 变量将其正确打包。我可能需要对控制器进行一些解析,但这对我来说很好。谢谢!
  • 你的 asp.net mvc 版本是多少?你能显示http请求吗?

标签: javascript c# jquery ajax json


【解决方案1】:

dataKeys 负载需要被字符串化为:

$.ajax({
    //prev code
    data: { datakeys : JSON.stringify(DataKeys) }
}).done(function (data) {
   //success
});

在 MVC 控制器中,将 json 解译为:

public ActionResult CancelDoc(string[] datakeys)
{ 
    dynamic sourceJson = JsonConvert.DeserializeObject(dataKeys, typeof(object));
    DocObject Doc = new DocObject();
    List<string> Datakeys = sourceJson.ToList();

}

【讨论】:

  • 这正是我所需要的。谢谢。我唯一要说的是不能在 sourceJson 对象上直接调用 ToList() 。因此,我为此所做的更改是将 typeof() 从 object 更改为 string[] 并将 List 分配行替换为 List&lt;string&gt; Datakeys = new List&lt;string&gt;(sourceJson); 否则很好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2019-02-16
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
相关资源
最近更新 更多