为什么在MVC4 Web应用中,我必须匹配参数名称才能从AJAX调用中获取JSON数据?
为什么在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}); } // 只是一个例子。
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 为什么我必须匹配键名和参数名?
它就是这样的?肯定有原因,我想知道为什么。
我想要做的是...
{
"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的查询部分搜索,甚至在POST请求中搜索表单字段来填充所有参数。
如果你的项目很复杂,有一百个模型也不算太糟糕。然而,如果你不得不回过头来修改整个应用程序,那可能会很麻烦。
无论你做什么,你都需要确保你的JavaScript变量名称与Action方法的参数名称匹配,这应该不是一个问题,因为你两边都在编写代码。
解决方法是确保JavaScript变量名与Action方法的参数名相匹配。这可以通过在Ajax调用中指定参数名称来实现。例如,如果你的Action方法有一个名为"param1"的参数,你可以这样写Ajax调用:
$.ajax({ url: '/Controller/Action', type: 'POST', data: { param1: value1 }, success: function(result) { // 处理返回的数据 } });
在上面的代码中,"param1"是Action方法的参数名,"value1"是你要传递的值。通过这种方式,你可以确保传递给Action方法的参数与JavaScript变量名相匹配,从而正确地获取JSON数据。
问题出现的原因:
在MVC4 web应用程序中,从Ajax调用获取JSON数据时,需要将参数名称与JSON数据匹配。否则,将无法正确获取JSON数据。
解决方法:
需要在控制器的Action方法中进行以下操作:
1. 使用HttpPost属性标记该方法,以确保它只能通过POST请求访问。
2. 使用Request.InputStream获取请求的输入流。
3. 将输入流的位置重置为起始位置。
4. 使用StreamReader读取输入流中的所有内容,并将其转换为字符串。
5. 使用Json方法将JSON字符串封装到一个匿名对象中,并作为ActionResult返回。
以下是示例代码:
[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 }); }
通过以上操作,就能够正确地从Ajax调用中获取JSON数据。