71

我整个下午都在尝试在网络上爬行,试图在动作控制器中接收 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 对象?

4

4 回答 4

86

不幸的是,Dictionary 在 MVC 中的模型绑定存在问题。在这里阅读全文。相反,创建一个自定义模型绑定器以获取 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 数据作为您的操作参数,您应该[FromBody]在控制器操作中的参数名称之前添加属性。注意:如果您使用的是 ASP.NET Core 2.1,您还可以使用该[ApiController]属性为您的复杂操作方法参数自动推断 [FromBody] 绑定源。(文件)

在此处输入图像描述

于 2014-02-05T13:54:22.177 回答
15

这里有几个问题。首先,您需要确保将 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);
        }
   });
于 2014-02-05T13:48:41.023 回答
4

您正在发送一个字符串数组

var usersRoles = [];
jQuery("#dualSelectRoles2 option").each(function () {
    usersRoles.push(jQuery(this).val());
});   

所以相应地改变模型类型

 public ActionResult AddUser(List<string> model)
 {
 }
于 2014-02-05T13:54:50.550 回答
3

fwiw,这对我不起作用,直到我在 ajax 调用中有这个:

contentType: "application/json; charset=utf-8",

使用 Asp.Net MVC 4。

于 2016-12-13T22:53:14.330 回答