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?
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)
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);
}
});
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)
{
}
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.