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


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对象?


尽管这指定了MVC5,但解决方案相同,因此这是将JSON数据发布到ASP.NET MVC
Chris Moschini

Answers:


85

不幸的是,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]绑定源。(文件)

在此处输入图片说明


1
嗯,所以需要开机自检吗?我遇到了同样的问题,模型的参数是null,但是当我将POST添加到我的ajax调用和mvc控制器时,我的模型不再为null。唯一令我困扰的是,如果您为javascript中的属性之一分配空字符串,并将此对象与ajax一起传递给服务器,则在C#中,服务器会将这些空字符串属性读取为null。我也希望它们在C#中也是一个空字符串。
QuantumHive 2015年

找到了解决该问题如上所述:stackoverflow.com/questions/12734083/...
QuantumHive

2
我复制/粘贴了该代码,然后“点击”了该方法,但是model.Name为null(角色也是如此)。我正在使用.NET Core-是否需要更改设置?
Rune Jeppesen

2
@RuneJeppesen我知道,已经很晚了,但是对于其他想知道如何在ASP.NET Core中运行它的人,只需将其添加[FromBody]到Model参数中即可public ActionResult AddUser([FromBody] PersonModel model)
jAC

您能否告诉我,如果在您的示例中而不是POST,而我想在ajax调用中使用GET,则需要进行哪些更改?
user734028

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

1
这对我有用,我摆脱了stringify,因为它在字符串中加上了引号,但是当我不调用stringify时,它没有引号就进入了控制器。这使我可以在帖子中输入字符串。这得到了我的支持。
史蒂文·爱迪生

4

您正在发送字符串数组

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

因此相应地更改模型类型

 public ActionResult AddUser(List<string> model)
 {
 }

所以你是说我不应该对数据进行json处理?
Zapnologica

@Zapnologica,data: JSON.stringify(usersRoles)仅是正确的,您需要。您的ajax代码是完美的。但是您的操作方法需要一个字典参数,但是您正在发送字符串数组:)
Murali Murugesan 2014年

我尝试了List <String>模型,它收到了null
Zapnologica

@Zapnologica,您可以在Firebug或chrome的Firebug的帮助下查看ajax请求,并且可以将帖子数据粘贴到此处的服务器吗?
Murali Murugesan 2014年

3

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

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

使用Asp.Net MVC 4。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.