为什么我必须匹配参数名称以从MVC4 Web应用程序中的ajax调用获取json数据?

我只是想知道为什么.NET需要将参数名称与JSON对象的键名匹配?

这里快速代码预览…

var json = { "service": "COMMON", "method": "MENU_SUBLIST", "UID": "1000007", "ULID": "stackoverflow", "UNM": "queston", "SITE": "1", "DEPT": "2", "LANG": "ko", "MENUID": "0000", "STEPMENU": "", "ACTIONNAME": "" } 

好吧,让我们通过Ajax在控制器中调用一个动作。

 $.ajax({ type: "POST", url: "DATACRUD.json", data: JSON.stringify(json), contentType: "application/json; charset=utf-8", dataType: "json", async: false, //_async, success: function (result) { } }); 

我的c#动作代码在这里..

 [HttpPost] public ActionResult DATACRUD(string jsondata) { return Json(new{ fromMVC = jsondata}); } // Just example. 

jsondata在这里是null因为我没有匹配密钥名称。

要让DATACRUD获取JSON数据,我必须这样做。

 { jsondata : { "service":"COMMON", "method":"MENU_SUBLIST", "UID":"1000007", "ULID":"stackoverflow", "UNM":"queston", "SITE":"1", "DEPT":"2", "LANG":"ko", "MENUID":"0000", "STEPMENU":"", "ACTIONNAME":"" } } 

问题1 为什么我必须将密钥名称与param名称匹配?

它只是吗? 这是一个原因,我想知道为什么。


而我想做的是……

 { "service":"COMMON", "method":"MENU_SUBLIST", "UID":"1000007", "ULID":"stackoverflow", "UNM":"queston", "SITE":"1", "DEPT":"2", "LANG":"ko", "MENUID":"0000", "STEPMENU":"", "ACTIONNAME":"" } 

将此JSON数据传递给我在上面指定的DATACRUD操作

我希望DATACRUD操作获取JSON数据并使用它,无论密钥名称是什么。

还有另一个答案。 答案是为JSON数据创建一个模型并将其作为模型类型接收,并将模型作为字符串。

但是在我的应用中无法定义模型。 它可能导致一百个模型创建。

因此,在制作模型后接收JSON数据是我需要的最后一件事。

在这种情况下,我该怎么办?

不允许使用密钥名称匹配。

不允许生成模型。

不允许第三方框架。

我认为可能的答案缩小到几个……

我该怎么办?

基于post MVC控制器:从HTTP主体获取JSON对象? 你的行动应该是:

 [HttpPost] public ActionResult DATACRUD() { Stream req = Request.InputStream; req.Seek(0, System.IO.SeekOrigin.Begin); string json = new StreamReader(req).ReadToEnd(); return Json(new { fromMVC = json }); } 

MVC路由引擎规定参数名称必须匹配,因为它知道要填充什么,因为所有内容都作为字符串传递给服务器 。 MVC管道将搜索URL的查询部分,甚至在POST上的表单中搜索字段以填充所有参数。

拥有一百个模型对于复杂的项目来说并不是那么糟糕。 但是,如果您必须返回并改造整个应用程序,那将是一件痛苦的事。

无论你做什么,你都需要确保你的JavaScript变量名称与你的Action方法参数相匹配,这不应该是一个问题,因为你写的是双方。