Asp.net MVC控制器动作字符串参数未传递

4

在我的控制器中,我有以下代码:

 public JsonResult GetInfo(string id)

在我的JS中
 $.ajax({
        contentType: 'application/json, charset=utf-8',
        type: "POST",
        url: "/Incidents/GetInfo",
        data: { id: "777" },
        cache: false,
        dataType: "json",

        success: function (response) {
//etc....

当使用jQuery的ajax方法时,如果发生错误则会触发代理(delegate)函数。

 data: { "777" },

没有出现错误,但是值没有被传递。这应该很简单,但我一直在苦思冥想。也许我不能将字符串传递给控制器的操作?

我在这里做错了什么?


你使用的是哪个版本的MVC?如果你使用的是MVC 2,你必须从MVC Futures安装JsonValueProviderFactory - counsellorben
2个回答

12
你正在指定使用application/json的请求,但你发送的却是一个application/x-www-form-urlencoded请求。因此,你需要在这两种编码参数的方式中选择一种,并避免混合使用它们。
$.ajax({
    type: "POST",
    url: "/Incidents/GetInfo",
    data: { id: "777" },
    cache: false,
    dataType: "json",
    ...
});

application/json:

application/json 是指一种常用的数据传输格式,它使用 JavaScript 对象表示法(JSON)来编码数据。

$.ajax({
    type: "POST",
    url: "/Incidents/GetInfo",
    contentType: 'application/json, charset=utf-8',
    data: JSON.stringify({ id: "777" }),
    cache: false,
    dataType: "json",
    ...
});

JSON.stringify方法是现代浏览器原生内置的功能,它用于将JavaScript字面量转换为JSON字符串,这正是我们要发送请求的内容。如果你需要支持旧版浏览器,可以在页面中包含json2.js脚本,其中包含了此方法。

顺带一提,dataType: "json"设置是不必要的,因为服务器会设置正确的Content-Type头为application/json,而jQuery足够聪明以使用这个头信息。

其次,你真的不想在JavaScript文件中硬编码URL:url:"/Incidents/GetInfo"。你应该在生成URL时使用URL帮助程序:url: "@Url.Action("GetInfo", "Incidents")"


我会再次尝试使用 JSON.stringify - 我想我已经尝试过了,但这样做无妨。最初我的代码类似于 var data = JSON.stringify(id),然后是 data:data。但看起来我错过了 id: 部分。我明天会尝试并告诉你结果。 - sarsnake
@sarsnake,JSON.stringify(id)是错误的。stringify方法需要一个JavaScript对象:JSON.stringify({ id: id }),其中你之前定义了id变量。请看我的回答。 - Darin Dimitrov
快速提问,Darin - 我以前经常使用JSON.stringify,但我的印象是像{"id":"777"}这样做基本上是在做同样的事情?不是吗?在我看来它看起来像JSON格式。 - sarsnake
1
@sarsnake,这完全不是一回事。对你来说可能看起来像JSON格式,但实际上不是。它被称为JavaScript字面量。jQuery使用application/x-www-form-urlencoded将JavaScript字面量转换。使用诸如FireBug之类的调试工具查看发送的请求。当你使用data: { foo: 'f', bar: 'b' }时,实际请求会变成这样:foo=f&bar=b。另一方面,JSON.stringify将JavaScript字面量转换为JSON字符串。所以data: JSON.stringify({ foo: 'f', bar: 'b' })将被发送为:{ "foo": "f", "bar": "b" }。明白了吗?没有任何共同之处。 - Darin Dimitrov

0

你的操作中是否缺少HttpPost属性?如果没有,请使用类似Firebug或Chrome开发工具来查看HTTP请求/响应并获取更多详细信息...

[HttpPost]
public JsonResult GetInfo(string id)

谢谢,我会尝试的。希望这能揭开这个谜团。 - sarsnake
没有必要添加这个属性,而且添加它也无法解决问题。这个属性强制使用POST方法,但是没有这个属性的操作可以使用任何动词调用。 - Darin Dimitrov
@DarinDimitrov 很有趣...我不知道那个。谢谢你的评论。 - B Z

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