为什么在MVC4 Web应用中,我必须匹配参数名称才能从AJAX调用中获取JSON数据?

11 浏览
0 Comments

为什么在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数据是我最后需要的事情。

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

不允许键名匹配。

不允许生成模型。

不允许使用第三方框架。

我认为可能的答案只有几个...

我该怎么办?

0
0 Comments

问题的原因是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数据。

0
0 Comments

问题出现的原因:

在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数据。

0