如何将JSON作为MVC 5操作方法参数接收

时间:2014-02-05 13:32:54

标签: asp.net asp.net-mvc json actionmethod

我整个下午一直在尝试在动作控制器中接收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 个答案:

答案 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)

enter image description here

答案 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.