C# 为什么我必须匹配参数名才能从MVC4 web app中的ajax调用中获取json数据?

C# 为什么我必须匹配参数名才能从MVC4 web app中的ajax调用中获取json数据?,c#,ajax,asp.net-mvc,json,asp.net-mvc-4,C#,Ajax,Asp.net Mvc,Json,Asp.net Mvc 4,我只是想知道为什么.NET需要将参数名与JSON对象的键名匹配 快速代码预览这里 var json = { "service": "COMMON", "method": "MENU_SUBLIST", "UID": "1000007", "ULID": "stackoverflow", "UNM": "queston", "SITE": "1", "DEPT": "2", "LANG": "ko", "MENUID":

我只是想知道为什么.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在这里为空,因为我与密钥名不匹配

为了让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为什么我必须将密钥名称与参数名称匹配?

真的吗?一定有原因,我想知道为什么


我想做的是…

{         
        "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数据是我最不需要的

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

不允许密钥名称匹配

不允许生成模型

不允许使用第三方框架

我认为可能的答案仅限于几个


我必须做什么?

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

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

不管你做什么,你都需要确保你的JavaScript变量名与你的动作方法参数匹配,这应该不会是个问题,因为你写的是两个方面。

基于post 你的行动应该是:

[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 });
}

默认模型绑定器是导致此行为的原因。它对从HTTP请求->C#代码获取命名方案做了很多假设。您可以编写自己的自定义模型活页夹,也可以像py3r3str的回答那样直接从流中读取。非常感谢。这就是我要找的。非常感谢。我现在明白了。