C# 为什么我必须匹配参数名才能从MVC4 web app中的ajax调用中获取json数据?
我只是想知道为什么.NET需要将参数名与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":
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的回答那样直接从流中读取。非常感谢。这就是我要找的。非常感谢。我现在明白了。