web-dev-qa-db-fra.com

Comment recevoir JSON en tant que paramètre de méthode d'action MVC 5

J'ai passé toute l'après-midi à explorer le Web, à essayer de recevoir un objet JSON dans le contrôleur d'action.

Quel est le moyen correct et/ou plus facile de s'y prendre?

J'ai essayé ce qui suit

    //Post/ Roles/AddUser
    [HttpPost]
    public ActionResult AddUser(String model)
    {
        if(model != null)
        {
            return Json("Success");
        }else
        {
            return Json("An Error Has occoured");
        }

    }

Ce qui m'a donné une valeur nulle sur mon entrée.

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

    }

ce qui me donne une erreur 500 du côté jquery qui essaye de poster à elle? (ce qui signifie que cela ne s'est pas lié correctement).

voici mon code 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);
        }
    });
}

Tout ce que je veux faire, c'est recevoir mon objet JSON dans mon action mvc?

65
Zapnologica

Malheureusement, Dictionary a des problèmes avec la liaison de modèle dans MVC. Lire l'histoire complète ici . Au lieu de cela, créez un classeur de modèle personnalisé pour obtenir le dictionnaire en tant que paramètre de l'action du contrôleur.

Pour répondre à vos besoins, voici la solution qui vous convient:

Commencez par créer vos ViewModels de la manière suivante. PersonModel peut avoir une liste de 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;}
}
_

Ensuite, avoir une action d'index qui servira la vue d'index de base -

_    public ActionResult Index()
    {
        return View();
    }
_

La vue index suivra l'opération 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" />
_

Action d'indexation sur l'action AddUser -

_    [HttpPost]
    public ActionResult AddUser(PersonModel model)
    {
        if (model != null)
        {
            return Json("Success");
        }
        else
        {
            return Json("An Error Has occoured");
        }

    }
_

Alors maintenant, quand la publication arrive, vous pouvez obtenir toutes les données publiées dans le paramètre de modèle d'action.

Mise à jour:

Pour asp.net core, pour obtenir des données JSON en tant que paramètre d'action, vous devez ajouter l'attribut [FromBody] avant votre nom de paramètre dans l'action de votre contrôleur. . Remarque: si vous utilisez ASP.NET Core 2.1, vous pouvez également utiliser l'attribut _[ApiController]_ pour déduire automatiquement la source de liaison [FromBody] pour vos paramètres de méthode d'action complexe. (Doc)

enter image description here

76
ramiramilu

Il y a quelques problèmes ici. Tout d'abord, vous devez vous assurer de relier votre objet JSON au modèle dans le contrôleur. Ceci est fait en changeant

data: JSON.stringify(usersRoles),

à

data: { model: JSON.stringify(usersRoles) },

Deuxièmement, vous ne liez pas les types correctement avec votre appel jQuery. Si vous enlevez

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

il sera intrinsèquement lié à une chaîne.

Tous ensemble, utilisez la première méthode ActionResult et l’appel jquery ajax suivant:

    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);
        }
   });
14
Mike Lorenzana

Vous envoyez un tableau de chaîne

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

Alors changez le type de modèle en conséquence

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

fwiw, cela ne fonctionnait pas pour moi tant que je n'avais pas ceci dans l'appel ajax:

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

en utilisant Asp.Net MVC 4.

3
Trober