Je crée une petite application pour m'enseigner ASP.NET MVC et JQuery, et l'une des pages est une liste d'éléments dans lesquels certains peuvent être sélectionnés. Ensuite, je voudrais appuyer sur un bouton et envoyer une liste (ou quelque chose d'équivalent) à mon contrôleur contenant les identifiants des éléments qui ont été sélectionnés, en utilisant la fonction Post de JQuery.
J'ai réussi à obtenir un tableau avec les identifiants des éléments sélectionnés, et maintenant je veux le publier. Une façon de le faire est d'avoir un formulaire factice dans ma page, avec une valeur masquée, puis de définir la valeur masquée avec les éléments sélectionnés et de publier ce formulaire; cela semble cruel, cependant.
Existe-t-il un moyen plus propre d'y parvenir, en envoyant le tableau directement au contrôleur? J'ai essayé différentes choses, mais il semble que le contrôleur ne puisse pas mapper les données qu'il reçoit. Voici le code jusqu'à présent:
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
Et puis ma manette ressemble à ça
public ActionResult GenerateList(List<string> values)
{
//do something
}
Tout ce que j'ai réussi à obtenir est un "null" dans le paramètre du contrôleur ...
Des conseils?
la source
Request["values[]"]
Réponses:
J'ai modifié ma réponse pour inclure le code d'une application de test que j'ai faite.
Mise à jour: J'ai mis à jour jQuery pour définir le paramètre «traditionnel» sur true afin que cela fonctionne à nouveau (par réponse de @DustinDavis).
Tout d'abord le javascript:
Et voici le code dans ma classe de contrôleur:
Quand j'appelle cette fonction javascript, j'obtiens une alerte disant "Premier élément de la liste: 'item1'". J'espère que cela t'aides!
la source
dataType: 'JSON'
jQuery tente d'analyser la réponse en tant que JSON et génère une erreur si ce n'est pas un JSON valide.dataType: 'json'
est pour le type de retour et n'est pas obligé d'envoyer le tableau à Action.contentType: "application/json; charset=utf-8"
, est celui-ci, mais dans certains cas, ce n'est pas obligatoire.var postData = { id: 45, [{myClassProp1: 1, myClassProp2: 2}, {}...], anotherParam: "some string" };
FYI: JQuery a changé la façon dont ils sérialisent les données de publication.
http://forum.jquery.com/topic/nested-param-serialization
Vous devez définir le paramètre `` Traditionnel '' sur vrai, sinon
sortira comme
au lieu de
la source
$.ajax({ ..., traditional: true});
aidera à revenir à la sérialisation traditionnelle.ints
. Quand j'utilisetraditional: true
, ça marche, votre réponse et votre lien expliquent pourquoi . Cela fonctionne également lorsque j'utilisetype: "POST"
, sans utilisertraditional: true
. Pourquoi donc? Pourriez-vous s'il vous plaît élaborer. Pour info, j'utilise Asp.Net Mvc.Merci à tous pour les réponses. Une autre solution rapide sera d'utiliser la méthode jQuery.param avec le paramètre traditionnel défini sur true pour convertir l'objet JSON en chaîne:
la source
Ne publiez pas les données sous forme de tableau. Pour se lier à une liste, les paires clé / valeur doivent être soumises avec la même valeur pour chaque clé.
Vous ne devriez pas avoir besoin d'un formulaire pour ce faire. Vous avez juste besoin d'une liste de paires clé / valeur, que vous pouvez inclure dans l'appel à $ .post.
la source
Dans
.NET4.5
,MVC 5
Javascript:
objet dans JS:
mécanisme qui affiche.
C #
Objets:
Manette:
Objet reçu:
J'espère que cela vous fera gagner du temps.
la source
Une autre implémentation qui fonctionne également avec une liste d'objets, pas seulement des chaînes:
JS:
En supposant que «selectedValues» est un tableau d'objets.
Dans le contrôleur, le paramètre est une liste de ViewModels correspondants.
la source
Comme je l'ai discuté ici ,
si vous voulez passer un objet JSON personnalisé à l'action MVC, vous pouvez utiliser cette solution, cela fonctionne comme un charme.
Le véritable avantage de cette solution est que vous n'avez pas besoin de définir une nouvelle classe pour chaque combinaison d'arguments et à côté de cela, vous pouvez convertir facilement vos objets dans leurs types d'origine.
Vous pouvez utiliser une méthode d'aide comme celle-ci pour faciliter votre travail:
la source
Vous pouvez configurer le paramètre global avec
la source
La réponse m'a beaucoup aidé dans ma situation alors merci pour cela. Cependant, pour de futures références, les personnes doivent se lier à un modèle puis valider. Cet article de Phil Haack décrit ceci pour MVC 2. http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx
J'espère que cela aide quelqu'un.
la source