从JQuery向ASP.NET MVC 4动作发布JSON

7

我正在开发一个使用ASP.NET MVC 4的应用程序。在某些方面,我感觉自己像是从头开始学习 :). 我被告知这很值得。

我需要将一些JSON发布到我的控制器中的操作。我的操作如下所示:

[Authorize]
public class MyController : Controller
{
    [HttpPost]
    public ActionResult RemoveItem(string itemID)
    {
      // Do stuff...
      return Json(new { Status = 1, Message="Success" });
    }
}

我的JQuery代码看起来像这样:

function removeItem(id) {
  var json = { "itemID": id };
  $.ajax({
    type: "POST",
    url: "/myController/removeItem",
    contentType: "application/json; charset=utf-8",
    data: json,
    dataType: "json",
    success: removeItemCompleted,
    error: removeItemFailed
  });
}

function removeItemCompleted(results) {
}

function removeItemFailed(request, status, error) {
}

在Fiddler中,我注意到返回了500错误。响应中的 TITLE 字段显示:“Invalid JSON primitive: itemID”。
我的操作哪里出错了?
谢谢!

你的 json 变量的值是什么样子? - Richard Neil Ilagan
1
如果这就是你要传递的所有内容,那么实际上没有必要创建变量。你的方法期望一个名为 itemID 的字符串,所以你应该这样做:data: { itemID: id }itemID 不需要加引号。 - Marcus Recck
@MarcusRecck 没有双引号就不是有效的 JSON。 - Rory McCrossan
我想学习JSON方法。实际上,我需要传递更多的数据。为了举例子,我试图将其简化。但是我的所有数据都是键/值对,没有嵌套数组或其他类似的东西。这就是为什么我想使用JSON的原因。 - Bill Jones
@BillJones - 我明白了,但在这种情况下,除了itemId之外,没有必要传递任何其他内容。如果您的操作需要一个对象,则可以通过网络发送一个json字符串化的对象。 - ek_ny
天哪,我希望我不必每次开始一个需要将JSON发布到操作方法的新MVC项目时都要在互联网上搜索这篇文章。难道只有我觉得你必须将这些东西复制/粘贴到每个项目中很糟糕吗? - Alex Dresko
4个回答

11

一定要发送 JSON:

data: json,

应该是

data: JSON.stringify(json),

IE7及以下版本需要一个shim:https://github.com/douglascrockford/JSON-js

注意:Dave A的回答也是正确的,但不直接回答您的问题。 我给他点了个赞。


1
谢谢@Joe,仇恨者无处不在。 - Dave Alperovich

6

这里好像不需要使用JSON。理想情况下,id参数应该在URI中传递:

 url: "/myController/removeItem/"+id

这可能是为什么您的操作无法识别。它需要一个参数。

后续:批评者指出传递的数据是字符串,因此不能作为id传递是不正确的。我应该指出,操作方法应该重新编写以接受string id


Dave请检查他的控制器操作。他将其作为字符串而不是整数提及。通过将id附加到url上,我认为无法完成。 - Karthik Chintala
啊,是的,我有点粗心。这是讨厌的好借口 ;) 它确实应该作为一个 ID 传递。无论是字符串还是其他类型。 - Dave Alperovich
作为跟进,@Karthik,你完全错了,ID可以是字符串。 - Dave Alperovich
如果我的评论有误,我很抱歉。如果传递的是字符串而不是整数,它能通过吗?我认为如果是字符串,则只能传递字符串。感谢您的跟进。 - Karthik Chintala
我并不是你的仇敌 Dave。我发现你在 SO 上的许多帖子都很有用。抱歉,当我评论时没有表达得更好。 - Karthik Chintala

4
          function removeItem(id) {
  var json = { "itemID": id };
  $.ajax({
    type: "POST",
    url: "/myController/removeItem",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(json),
    dataType: "json",
    success: removeItemCompleted,
    error: removeItemFailed
  });
}

function removeItemCompleted(results) {
}

function removeItemFailed(request, status, error) {
}

0
请使用以下代码:
$('#delete').click(function () {
        var APIURL = "/api/products";
        var id = $('#SearchText').val();
        $.ajax({
            type: "DELETE",
            url: APIURL + '/' + id,
            success: function (data) {
                alert('Employee deleted');
            }
        });
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接