小编典典

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

json

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


阅读 260

收藏
2020-07-27

共1个答案

小编典典

不幸的是,Dictionary在MVC中存在模型绑定问题。在这里阅读全文。而是创建一个自定义模型联编程序,以将Dictionary作为控制器操作的参数。

为了满足您的要求,这是可行的解决方案-

首先按照以下方式创建ViewModels。PersonModel可以具有RoleModels的列表。

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");
    }
}

因此,现在发布时,您可以在action的模型参数中获取所有发布的数据。

更新:

对于asp.net核心,要获取JSON数据作为操作参数,应 [FromBody]
在控制器操作中的参数名称之前添加属性。注意:如果您使用的是ASP.NET Core
2.1,则还可以使用该[ApiController]属性来自动推断复杂操作方法参数的[FromBody]绑定源。(文档)

在此处输入图片说明

2020-07-27