使用Ajax向MVC控制器发布JSON数据

3
我一直试图将JSON数据传递到MVC4控制器中,但到目前为止还没有成功。
同时,我已经Google了数千次。
解决这个问题的关键是要字符串化JSON对象,定义一个模型并将参数作为该定义的模型获取,或者定义contentType。
我采用了定义模型的方法来传递JSON到控制器中。
如果我每次尝试将JSON参数传递到服务器时都必须定义模型,我就不会在MVC4上构建我的应用程序,我会放弃!
有没有另一种方法可以在没有为JSON数据创建模型的情况下从Ajax调用中获取JSON数据?
以下是我的示例代码。
[HttpPost]
public ActionResult DATACRUD(string XmlParms)
{
    return Json(new{ data = XmlParms });
}
// Just example.

一个Ajax调用是什么。
$.ajax({
        type: "POST",
        url: "DATACRUD.json",
        data: JSON.stringify({data:"test"}),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false, //_async,
        success: function (result) {
        }
});

Ajax成功调用了控制器中的操作,但参数为null。

请不要告诉我定义JSON参数的模型是解决此问题的唯一方法。

如果我必须这样做,那将会非常令人沮丧。


更新:

如果我必须匹配键名和参数名,我也会放弃。

在我的应用程序中,JSON数据通常是这样的。

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

但问题在于,JSON数据有许多不同种类的键名。

我无法一一匹配这些名称。在这种情况下,我该怎么办?

(请注意:像下面这样包装数据并不是我的解决方案,因为存在兼容性问题。)

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

这里的 "test" 是什么? - undefined
你试过 JSON.stringify({XmlParms:"test"}) 吗? - undefined
$.ajax中的action url是否正确? - undefined
@mohammadrezaberneti 是的,没错。我在routeconfig中设置了URL。 - undefined
在控制器中,除了为JSON数据创建一个模型之外,还有其他获取Ajax调用中的JSON数据的方法吗?如果你需要多个参数而没有模型,你无法只定义一个参数字符串。模型是绑定每个参数的最佳方式。如果你需要一个字符串,也许你可以将你尝试发送的"对象"转换为字符串,然后你可以控制如何拆分它们。但我认为模型是最好的解决方案。 - undefined
请查看这个链接:http://www.codingfusion.com/Post/Posting-JSON-Data-to-ASP-NET-MVC-with-Code-Examples - undefined
4个回答

3

你漏掉了一个小细节。在ajax调用中,参数名称应该相同。

    data: JSON.stringify({XmlParms:"test"}),

先生,我更新了我的问题。你能给我另一个解决方案吗?:( - undefined
非常感谢。匹配参数名称是我最需要的第一件事情。 - undefined

0

我只是从
$.ajax({ . . .

});

中删除了(contentType: "application/json; charset=utf-8",)属性。

这个操作使得数据可以从ajax接收!


0
因为你的控制器接受名为XmlParms的参数,所以为了使其正确绑定,你必须传递具有相应参数名称的数据。
假设你的JSON数据将被分配给一个名为jsonParams的JavaScript变量。那么你需要做的就是:
$.ajax({
        type: "POST",
        url: "DATACRUD.json",
        data: {XmlParms:jsonParams},
        contentType: "application/json; charset=utf-8",
        dataType: "application/xml-urlencode",
        async: false, //_async,
        success: function (result) {
        }
});

你只需要将它作为纯字符串传递,并在你的控制器中解析回 JSON 对象。

先生,我更新了我的问题。你能给我另一个解决方案吗?:( - undefined
感谢您的建议,但是为我来说,设置一个默认的键名并不是解决办法。无论键名是什么,我都必须接受JSON数据。 - undefined

0
首先,你的Action中的匿名对象语法是错误的;键应该使用=赋值,而不是:
[HttpPost]
public ActionResult DATACRUD(string XmlParms)
{
    return Json(new { data = XmlParms });
}

其次,你的操作期望一个名为XmlParms的参数,然而你在AJAX中只发送了一个字符串。尝试这样做:
$.ajax({
    type: "POST",
    url: "DATACRUD.json",
    data: { XmlParms: "test" },
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (result) {
        console.log(result.data); // = 'test'
    }
});

请注意,当您将一个对象传递给data属性时,您不需要手动使用JSON.stringify,因为jQuery会为您完成这个操作。

先生,我更新了我的问题。你能给我另一个解决方案吗?:( - undefined
很抱歉,我不明白你的更新意味着什么。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接