2009-06-16 5 views
6

Si youa sont sérialisation d'un formulaire en utilisant quelque chose comme jQuery, il tracera souvent les clés de JSON et des valeurs aux propriétés d'un objet sur l'action du contrôleur que vous envoyez des messages. Alors:Envoi d'éléments multiples au contrôleur MVC via jQuery.Ajax

jQuery:

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize(), 
     complete: callFunction 
     } 
    }); 

présumant détails principaux contient des éléments qui auront le nom du paramètre comme clé qu'ils doivent mapper directement à l'objet:

Action:

public void TestMVC(MyObject obj) 
{ 
//Obj should now contain the data from the serialised form 
} 

POST:

Name: "Bob" 
Age: "999" 
Sex: "Unknown" 

Est-ce que quelqu'un sait comment cela fonctionne? Il se casse chaque fois que je passe le formulaire et toutes les données supplémentaires au contrôleur.

Je voudrais envoyer le contenu des données ainsi qu'un QueryString qui pourrait contenir un nombre et types de paires clé/valeur au contrôleur. Je peux extraire ces paires clé/valeur sur le serveur car je ne peux pas créer un objet pour eux sur la signature de la méthode. Cependant, cela ne fonctionne pas comme prévu.

jQuery:

function PostForm() { 

    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: 
     { 
      Obj: $('#form').serialize(), 
      TheWeirdQueryString: $('.additionalParams').serialize(), 
     } 
    }); 
}; 

Action:

public void TestMVC(MyObject obj, String TheWeirdQueryString) 
{ 
//Obj now does NOT contain the element, it is NULL. Whereas TheWeirdQueryString works fine. 
} 

Poste:

Obj: name=bob&age=999&sex="unknown" 
TheWeirdQueryString: param1=1&param2=2 

Je pense que cela parce que je suis en fait créé un objet JSON que les données et définir les propriétés au nom de l'objet.

Il existe une différence entre les valeurs POST qui apparaissent dans Firebug. Lorsque je publie l'objet seul, les valeurs POST sont toutes les clés de l'objet/formulaire avec leurs valeurs correspondantes. Dans le second exemple, il y a deux propriétés simples, Le nom que je leur ai donné, contenant chacune une QueryString (Foo=1&Bar=2) et MVC ne peut pas mapper une QueryString aux membres d'un objet (ou alors il apparaîtrait).

Y at-il de toute façon du tout pour aller au travail comme il le fait en premier lieu, mais aussi d'envoyer des données supplémentaires à un 2ème argument de l'action? Je devine que c'est pour ajouter une propriété supplémentaire à tous ceux existants créés quand jquery fait la sérialisation du formulaire.

Le POST Je veux en fait est:

Name: "Bob" 
Age: "999" 
Sex: "Unknown" 
TheWeirdQueryString: param1=1&param2=2 
+0

Pouvez-vous afficher les valeurs POST que vous voyez pour les deux scénarios? Je ne comprends pas très bien votre description. –

+0

Terminé. Le dernier exemple est le message que j'essaie de faire. – Damien

Répondre

5

paramètre dataType dans la méthode $ .ajax est le type de réponse (le type de données que vous vous attendez à partir du serveur), ne demandera pas.Essayez ceci:

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize() + "&" + $('.additionalParams').serialize() 
    }); 
}; 

ou:

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC" + "?" + $('.additionalParams').serialize(), 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize() 
    }); 
}; 

mise à jour:

Essayez ceci:

Controller:

public void TestMVC(MyObject obj, String[] TheWeirdQueryString) 
{ 
} 

Client:

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize() + "&" + $('.additionalParams').serialize() 
    }); 
}; 

mais sur le client côté vos params supplémentaires doivent être dans le format suivant:

TheWeirdQueryString[0]=param1&TheWeirdQueryString[1]=param2&...&TheWeirdQueryString[n]=paramN 

donc $ (». AdditionalParams') éléments doivent avoir "id" et/ou "nom" attributs tels que: TheWeirdQueryString [1], TheWeirdQueryString [2] ... TheWeirdQueryString [N]

Hope this helps

+0

Le résultat de jquery reçoit un objet JSON, Mes références étaient parce que je pensais que le {} pour les données a créé un objet JSON? Le 1er exemple ne fonctionne pas. Il suffit d'ajouter ces paramètres au premier objet où j'ai besoin que tous les paramètres soient dans une chaîne en tant que paramètre unique. Le deuxième exemple fonctionne si j'utilise Request.QueryString. – Damien

+0

Le premier exemple devrait aussi fonctionner - avez-vous essayé?: var additionalParam = Form ["additionalParam"]; –

+0

J'ai essayé var content = $ ('. AdditionalParam'). Serialize()? Est-ce que form ["additionalParam"] est différent? – Damien

0

données est un objet

... 
data: { 
    x :$('#form').serialize(), 
    y:'something else' 
} 
... 
+0

Ouais, Le problème de cette façon était qu'il considérerait x une propriété d'un objet comme dans le 2ème exemple. Ce qui, je pense, vis le mappage des clés aux propriétés sur MVC. – Damien

+0

peut-être au lieu d'utiliser serialize(), en utilisant formSerialize() à partir de ce plugin http://malsup.com/jquery/form/ –

0

Une autre solution si vous voulez un dictionnaire de paires clé/valeur:

public void TestMVC(MyObject obj, IDictionary<string, object> TheWeirdQueryString) 
{ 
} 

Client:.

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize() + "&" + $('.additionalParams').serialize() 
    }); 
}; 

$ (». AdditionalParams') Format serialize():

TheWeirdQueryString[0].Key=param0&TheWeirdQueryString[0].Value=value0&TheWeirdQueryString[1].Key=param1&TheWeirdQueryString[1].Value=value1&...&TheWeirdQueryString[n].Key=paramN&TheWeirdQueryString[n].Value=valueN 

MIS À JOUR:

Vous avez besoin quelque chose comme ceci:

<input class="additionalParams" type="text" name="TheWeirdQueryString[0].Key" value="param0" /> 
<input class="additionalParams"type="text" name="TheWeirdQueryString[0].Value" value="value0" /> 
<!-- ... --> 
<input class="additionalParams"type="text" name="TheWeirdQueryString[n].Key" value="paramN" /> 
<input class="additionalParams"type="text" name="TheWeirdQueryString[n].Value" value="valueN" /> 
+0

EST ce que le format POST devrait être ou dois-je faire le format moi-même. Il continue à faire la clé: valeur clé: valeur au lieu de ce que vous avez posté – Damien

+0

J'ai ajouté un exemple de balisage HTML –

Questions connexes