J'essaie de passer un tableau d'objets dans une méthode de contrôleur MVC en utilisant la fonction ajax () de jQuery. Quand j'entre dans la méthode du contrôleur PassThing () C #, l'argument «choses» est nul. J'ai essayé cela en utilisant un type de liste pour l'argument, mais cela ne fonctionne pas non plus. Qu'est-ce que je fais mal?
<script type="text/javascript">
$(document).ready(function () {
var things = [
{ id: 1, color: 'yellow' },
{ id: 2, color: 'blue' },
{ id: 3, color: 'red' }
];
$.ajax({
contentType: 'application/json; charset=utf-8',
dataType: 'json',
type: 'POST',
url: '/Xhr/ThingController/PassThing',
data: JSON.stringify(things)
});
});
</script>
public class ThingController : Controller
{
public void PassThing(Thing[] things)
{
// do stuff with things here...
}
public class Thing
{
public int id { get; set; }
public string color { get; set; }
}
}
c#
asp.net-mvc
jquery
Alcyon
la source
la source
Réponses:
En utilisant la suggestion de NickW, j'ai pu faire fonctionner cela en utilisant
things = JSON.stringify({ 'things': things });
Voici le code complet.J'ai appris deux choses:
Les paramètres contentType et dataType sont absolument nécessaires dans la fonction ajax (). Cela ne fonctionnera pas s'ils sont manquants. J'ai découvert cela après de nombreux essais et erreurs.
Pour transmettre un tableau d'objets à une méthode de contrôleur MVC, utilisez simplement le format JSON.stringify ({'things': things}).
J'espère que ça aidera quelqu'un d'autre!
la source
http://localhost:52459/Sales/completeSale?itemsInCart=[{"ItemId":1,"Quantity":"1","Price":3.5}]
etSales.completeSale
estpublic ActionResult completeSale(ItemInCart[] itemsInCart)
, annotée en tant queHttpGet
.data: JSON.stringify(things),
dataType
n'est pas nécessaire. S'il est omis, la fonction ajax fonctionnera en fonction des données de retourTu ne pourrais pas faire ça?
... et marquez votre action avec
la source
Le formatage de vos données peut être le problème. Essayez l'une de ces solutions:
Ou (de Comment puis-je publier un tableau de chaînes dans ASP.NET MVC Controller sans formulaire? )
la source
J'utilise une application Web .Net Core 2.1 et je n'ai pas pu obtenir une seule réponse ici pour fonctionner. J'ai soit un paramètre vide (si la méthode a été appelée du tout) soit une erreur de serveur 500. J'ai commencé à jouer avec toutes les combinaisons possibles de réponses et j'ai finalement obtenu un résultat satisfaisant.
Dans mon cas, la solution était la suivante:
Script - stringify le tableau d'origine (sans utiliser une propriété nommée)
Et dans la méthode du contrôleur, utilisez [FromBody]
Les échecs incluent:
Nommer le contenu
data: {content: nodes}, // Erreur serveur 500
Ne pas avoir le contentType = Erreur serveur 500
Remarques
dataType
n'est pas nécessaire, malgré ce que disent certaines réponses, car cela est utilisé pour le décodage de la réponse (donc pas pertinent pour les exemples de demande ici).List<Thing>
fonctionne également dans la méthode du contrôleurla source
J'ai la réponse parfaite à tout cela: j'ai essayé tellement de solutions que je n'ai pas réussi à gérer moi-même, veuillez trouver la réponse détaillée ci-dessous:
Contrôleur
la source
La seule façon dont je pourrais faire fonctionner cela est de passer le JSON en tant que chaîne, puis de le désérialiser à l'aide
JavaScriptSerializer.Deserialize<T>(string input)
, ce qui est assez étrange si c'est le désérialiseur par défaut pour MVC 4.Mon modèle comporte des listes d'objets imbriquées et le mieux que je puisse obtenir en utilisant les données JSON est la liste la plus élevée pour contenir le nombre correct d'éléments, mais tous les champs des éléments étaient nuls.
Ce genre de chose ne devrait pas être si difficile.
la source
C'est du code de travail pour votre requête, vous pouvez l'utiliser.
Contrôleur
javascript
la source
Enveloppant votre liste d'objets avec un autre objet contenant une propriété qui correspond au nom du paramètre attendu par le contrôleur MVC fonctionne. L'important étant le wrapper autour de la liste d'objets.
la source
la source
Si vous utilisez l'API Web ASP.NET, vous devez simplement passer
data: JSON.stringify(things)
.Et votre manette devrait ressembler à ceci:
la source
Modification de @veeresh i
la source
Ce que j'ai fait en essayant d'envoyer des données à partir de plusieurs lignes sélectionnées dans l'action DataTable vers MVC:
HTML Au début d'une page:
(juste une ligne est affichée, lier à partir du modèle):
Bouton qui lance la fonction JavaScript:
Fonction JavaScript:
Action MVC:
Et MODÈLE en C #:
CONCLUSION:
La raison de l'ERREUR:
Est attribut:
[ValidateAntiForgeryToken]
pour l'action MVCStartWorkflow
Solution dans l'appel Ajax:
Pour envoyer une liste d'objets, vous devez former des données comme dans l'exemple (objet de liste de remplissage) et:
données: {model: list},
type: "post",
la source
Voici comment cela fonctionne bien pour moi:
Avec "ContentType" en majuscule "C".
la source