我整个下午一直在尝试在动作控制器中接收JSON对象,试图在网上爬行。
这样做的正确和/或更简单的方法是什么?
我尝试过以下方法: 1:
//Post/ Roles/AddUser
[HttpPost]
public ActionResult AddUser(String model)
{
if(model != null)
{
return Json("Success");
}else
{
return Json("An Error Has occoured");
}
}
这给了我输入的空值。
2:
//Post/ Roles/AddUser
[HttpPost]
public ActionResult AddUser(IDictionary<string, object> model)
{
if(model != null)
{
return Json("Success");
}else
{
return Json("An Error Has occoured");
}
}
这给了我jquery方面的500错误,试图发布到它? (意思是它没有正确绑定)。
这是我的jQuery代码:
<script>
function submitForm() {
var usersRoles = new Array;
jQuery("#dualSelectRoles2 option").each(function () {
usersRoles.push(jQuery(this).val());
});
console.log(usersRoles);
jQuery.ajax({
type: "POST",
url: "@Url.Action("AddUser")",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(usersRoles),
success: function (data) { alert(data); },
failure: function (errMsg) {
alert(errMsg);
}
});
}
我想要做的就是在我的mvc动作中接收我的JSON对象?
答案 0 :(得分:74)
不幸的是,Dictionary在MVC中存在模型绑定问题。 Read the full story here。而是创建一个自定义模型绑定器,以将Dictionary作为控制器操作的参数。
要解决您的要求,这是工作解决方案 -
首先按以下方式创建ViewModel。 PersonModel可以包含RoleModel列表。
public class PersonModel
{
public List<RoleModel> Roles { get; set; }
public string Name { get; set; }
}
public class RoleModel
{
public string RoleName { get; set;}
public string Description { get; set;}
}
然后有一个索引操作,它将提供基本的索引视图 -
public ActionResult Index()
{
return View();
}
索引视图将具有以下JQuery AJAX POST操作 -
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script>
$(function () {
$('#click1').click(function (e) {
var jsonObject = {
"Name" : "Rami",
"Roles": [{ "RoleName": "Admin", "Description" : "Admin Role"}, { "RoleName": "User", "Description" : "User Role"}]
};
$.ajax({
url: "@Url.Action("AddUser")",
type: "POST",
data: JSON.stringify(jsonObject),
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function (response) {
alert(response.responseText);
},
success: function (response) {
alert(response);
}
});
});
});
</script>
<input type="button" value="click1" id="click1" />
索引操作发布到AddUser操作 -
[HttpPost]
public ActionResult AddUser(PersonModel model)
{
if (model != null)
{
return Json("Success");
}
else
{
return Json("An Error Has occoured");
}
}
现在,当帖子发生时,您可以在模型参数中获取所有发布的数据。
<强>更新强>
对于asp.net核心,要将JSON数据作为操作参数,您应该在控制器操作中的param名称之前添加 [FromBody]
属性。注意:如果您使用的是ASP.NET Core 2.1,则还可以使用[ApiController]
属性自动推断复杂操作方法参数的[FromBody]绑定源。 (Doc)
答案 1 :(得分:13)
这里有几个问题。首先,您需要确保将JSON对象绑定回控制器中的模型。这是通过更改
来完成的data: JSON.stringify(usersRoles),
到
data: { model: JSON.stringify(usersRoles) },
其次,您没有正确地使用jquery调用绑定类型。如果删除
contentType: "application/json; charset=utf-8",
它本身会绑定回一个字符串。
总之,使用第一个ActionResult方法和以下jquery ajax调用:
jQuery.ajax({
type: "POST",
url: "@Url.Action("AddUser")",
dataType: "json",
data: { model: JSON.stringify(usersRoles) },
success: function (data) { alert(data); },
failure: function (errMsg) {
alert(errMsg);
}
});
答案 2 :(得分:4)
您正在发送一个字符串数组
var usersRoles = [];
jQuery("#dualSelectRoles2 option").each(function () {
usersRoles.push(jQuery(this).val());
});
因此相应地更改模型类型
public ActionResult AddUser(List<string> model)
{
}
答案 3 :(得分:3)
fwiw,这对我来说不起作用,直到我在ajax电话中有这个:
contentType: "application/json; charset=utf-8",
使用Asp.Net MVC 4.