189 votes

Comment puis-je publier un tableau de chaînes pour ASP.NET MVC Controller sans un formulaire?

Je suis entrain de créer une petite application pour apprendre par moi-même ASP.NET MVC et JQuery, et l'une des pages est une liste d'éléments dont certains peuvent être sélectionnés. Ensuite, je tiens à appuyer sur un bouton et envoyer une Liste (ou quelque chose d'équivalent) à mon contrôleur contenant les id des articles qui ont été sélectionnés, à l'aide de JQuery Poste de la fonction.

J'ai réussi à obtenir un tableau avec les id des éléments qui ont été sélectionnés, et maintenant, j'ai envie de poster. D'une manière que je pourrais faire c'est avoir un mannequin formulaire dans ma page, avec une valeur cachée, puis définissez la valeur cachée avec les éléments sélectionnés, et après que de la forme; cela ressemble crufty, cependant.

Est-il le moyen le plus propre pour y parvenir, par l'envoi de la matrice directement au contrôleur? J'ai essayé différentes choses mais il semble que le contrôleur ne pouvez pas mapper les données qu'il reçoit. Voici le code pour l'instant:

function generateList(selectedValues) {
   var s = {
      values: selectedValues //selectedValues is an array of string
   };
   $.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}

Et puis mon Contrôleur ressemble à ceci

public ActionResult GenerateList(List<string> values)
{
    //do something
}

Tout ce que je réussi à obtenir un "null" dans le paramètre du contrôleur...

Des conseils à donner?

250voto

MrDustpan Points 2900

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 le jQuery pour mettre le paramètre 'traditionnel' à true afin que cela fonctionne à nouveau (par @DustinDavis 'réponse).

D'abord le javascript:

 function test()
{
    var stringArray = new Array();
    stringArray[0] = "item1";
    stringArray[1] = "item2";
    stringArray[2] = "item3";
    var postData = { values: stringArray };

    $.ajax({
        type: "POST",
        url: "/Home/SaveList",
        data: postData,
        success: function(data){
            alert(data.Result);
        },
        dataType: "json",
        traditional: true
    });
}
 

Et voici le code dans ma classe de contrôleur:

 public JsonResult SaveList(List<String> values)
{
    return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}
 

Lorsque j'appelle cette fonction javascript, je reçois une alerte disant "Premier élément de la liste: 'item1'". J'espère que cela t'aides!

109voto

DustinDavis Points 7808

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

 { Values : ["1", "2", "3"] }
 

va sortir comme

 Values[]=1&Values[]=2&Values[]=3
 

au lieu de

 Values=1&Values=2&Values=3
 

24voto

Evgeny Points 2765

Merci à tous pour les réponses. Une autre solution rapide consistera à utiliser la méthode jQuery.param avec le paramètre traditionnel défini sur true pour convertir l'objet JSON en chaîne:

 $.post("/your/url", $.param(yourJsonObject,true));
 

9voto

Craig Stuntz Points 95965

Ne publiez pas les données sous forme de tableau. Pour 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 le faire. Vous avez juste besoin d'une liste de paires clé / valeur, que vous pouvez inclure dans l'appel à $ .post.

1voto

Mohsen Afshin Points 3643

Comme je l'ai expliqué ici ,

si vous souhaitez passer personnalisé objet JSON pour MVC action, alors vous pouvez utiliser cette solution, il fonctionne comme un charme.

    public string GetData()
    {
        // InputStream contains the JSON object you've sent
        String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd();

        // Deserialize it to a dictionary
        var dic = 
          Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<String, dynamic>>(jsonString);

        string result = "";

        result += dic["firstname"] + dic["lastname"];

        // You can even cast your object to their original type because of 'dynamic' keyword
        result += ", Age: " + (int)dic["age"];

        if ((bool)dic["married"])
            result += ", Married";


        return result;
    }

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 ça, vous pouvez jeter vos objets d'origine des types facilement.

et vous pouvez utiliser une méthode d'aide de ce genre pour faciliter votre travail

public static Dictionary<string, dynamic> GetDic(HttpRequestBase request)
{
    String jsonString = new StreamReader(request.InputStream).ReadToEnd();
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonString);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X