Как получить JSON в качестве параметра метода действия MVC 5

Я весь день пробовал ползать по сети, пытаясь получить объект 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");
    }

}

что дает мне ошибку 500 на стороне jquery, которая пытается опубликовать ее? (это означает, что он не привязался правильно).

вот мой код 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);
        }
    });
}

All I want to do is receive my JSON object in my mvc action?


person Zapnologica    schedule 05.02.2014    source источник
comment
Хотя здесь указан MVC5, решение такое же, поэтому это дубликат Posting Данные JSON в ASP.NET MVC   -  person Chris Moschini    schedule 06.04.2016


Ответы (4)


К сожалению, у Dictionary есть проблемы с привязкой модели в MVC. Прочтите полную историю здесь. Вместо этого создайте настраиваемый связыватель модели, чтобы получить словарь в качестве параметра для действия контроллера.

Чтобы решить ваше требование, вот рабочее решение -

Сначала создайте свои ViewModels следующим образом. 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] для параметров вашего сложного метода действия. (Док. )

введите описание изображения здесь

person ramiramilu    schedule 05.02.2014
comment
Ах, так это должен быть POST? У меня была та же проблема, аргумент модели был null, но когда я добавил POST к моему вызову ajax и к контроллеру mvc, моя модель больше не была нулевой. Единственное, что меня беспокоит, это то, что если вы назначаете пустую строку одному из свойств в javascript и передаете этот объект с помощью ajax серверу, в C # сервер считывает эти свойства пустой строки как null. Я бы предпочел, чтобы они тоже были пустой строкой на C #. - person QuantumHive; 11.03.2015
comment
нашел решение описанной выше проблемы: stackoverflow.com/questions/12734083/ - person QuantumHive; 11.03.2015
comment
Я копирую / вставляю это и «нажимаю» метод, но имя модели равно нулю (как и роли). Я использую .NET Core - есть ли параметр, который мне нужно изменить? - person Rune Jeppesen; 01.09.2016
comment
@RuneJeppesen Я знаю, уже поздно, но всем, кто интересуется, как заставить его работать в ASP.NET Core, просто добавьте [FromBody] к параметру модели: public ActionResult AddUser([FromBody] PersonModel model). - person jAC; 29.08.2017
comment
Можете ли вы сказать мне, какие изменения потребуются, если в вашем примере вместо POST я хочу использовать GET в вызове ajax. - person user734028; 05.05.2018
comment
У меня были проблемы с привязкой. Оказывается, я забыл сделать своих учеников общедоступными. - person kmxr; 05.09.2019

Здесь есть пара проблем. Во-первых, вам нужно убедиться, что ваш объект JSON обратно привязан к модели в контроллере. Это делается путем изменения

data: JSON.stringify(usersRoles),

to

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);
        }
   });
person Mike Lorenzana    schedule 05.02.2014
comment
Это сработало для меня, я избавился от stringify, поскольку он заключал мою строку в кавычки, но когда я не вызвал stringify, он пришел без кавычек в контроллер. Это позволило мне вставить строку в свой контроллер с сообщением. Это получил мой голос. - person Steven Edison; 03.05.2016

Вы отправляете массив строк

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

Поэтому измените тип модели соответствующим образом

 public ActionResult AddUser(List<string> model)
 {
 }
person Murali Murugesan    schedule 05.02.2014
comment
Значит, вы говорите, что я не должен изменять данные? - person Zapnologica; 05.02.2014
comment
@Zapnologica, правильно только data: JSON.stringify(usersRoles), оно вам и нужно. Ваш код ajax идеален. Но ваш метод действия ожидает параметр словаря, но вы отправляете массив строк :) - person Murali Murugesan; 05.02.2014
comment
Я попробовал модель List ‹String›, и она получила null - person Zapnologica; 05.02.2014
comment
@Zapnologica, можете ли вы просмотреть запрос ajax с помощью Firebug для Firefox или Chrome и вставить сюда свои данные публикации на сервер? - person Murali Murugesan; 05.02.2014

fwiw, это не сработало для меня, пока я не получил это в вызове ajax:

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

с использованием Asp.Net MVC 4.

person Trober    schedule 13.12.2016