Подтвердить что ты не робот

Как получить 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);
        }
    });
}

Все, что я хочу сделать, это получить мой объект JSON в моем действии mvc?

4b9b3361

Ответ 1

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

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

Сначала создайте свои 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");
        }

    }

Итак, теперь, когда сообщение происходит, вы можете получить все опубликованные данные в параметре модели действия.

enter image description here

Ответ 2

Здесь есть пара вопросов. Во-первых, вам нужно обязательно привязать свой объект 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);
        }
   });

Ответ 3

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

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

Соответственно измените тип модели

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

Ответ 4

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

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

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