2010-11-23 8 views
0

J'ai actuellement un ensemble de méthodes dans mes contrôleurs qui prennent des enregistrements sélectionnés à partir des lignes de table.Ensembles d'objets de mappage de passage ASP.NET MVC aux paramètres de contrôleur à partir de jQuery

Je pourrais avoir quelque chose comme

var ids = []; 
var prices = []; 
var customers = []; 

$selectedRow.each(function() { 
    ids.push($(this).find('.id').text()); 
    prices.push($(this).find('.price').text()); 
    customers.push($(this).find('.customer').text()); 
}); 

$.post(....) // AJAX call to controller method 

Et dans le contrôleur je me retrouve avec

public ActionResult DoSomething(int[] ids, double[] prices, string[] customers) { ... } 

qui est juste un peu en désordre pour faire face à l'utilisation d'itérateurs.

Ce que je voudrais vraiment est d'avoir

Class Foo 
{ 
    int id; 
    double price; 
    string customer; 
} 

et être en mesure de recevoir

public ActionResult DoSomething(List<Foo> foos) { ... } 

est-ce possible?

Répondre

3

Un peu hacky, mais voici un exemple:

// query array: construct this as usual 
var array = [{ id: '1', name: 'name 1' }, { id: '2', name: 'name 2'}]; 

// map the array into an array of DOM hidden fields 
var query = $.map(array, function (element, index) { 
    return [$(document.createElement('input')) 
        .attr('type', 'hidden') 
        .attr('name', 'foos[' + index + '].id') 
        .val(element.id), 
       $(document.createElement('input')) 
        .attr('type', 'hidden') 
        .attr('name', 'foos[' + index + '].name') 
        .val(element.name) 
       ]; 
}); 

// construct a form 
var form = $(document.createElement('form')); 
$(query).appendTo(form); 

$.ajax({ 
    url: '<%: Url.Action("Test") %>', 
    data: form.serialize(), 
    dataType: 'json', 
    success: function (result) { 
     alert('success'); 
    } 
}); 

Cela se lier avec succès à une action de contrôleur de la forme:

public ActionResult Test(IEnumerable<Foo> foos) 
{ 
    ...  
} 

où Foo:

public class Foo 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

Remarque: Tout cela est pas nécessaire si vous configure your controller action to accept JSON. Dans ASP.NET MVC 3, ceci est automatiquement inclus dans le framework.

+0

ce hack post semble intéressant, je vais vérifier merci. – fearofawhackplanet

0
+0

Je n'essaie pas de modéliser le lien à une forme si, ces solutions ne fonctionneront pas avec jQuery les valeurs soumises vont-elles? – fearofawhackplanet

+0

Oui, ils le feront si vous utilisez '(" #form "). Serialize()' lors de la soumission du formulaire lui-même – Lorenzo

+0

mais je n'ai pas de formulaire !? – fearofawhackplanet

0

Phil Haack a écrit un billet de blog sur ce aussi: Model Binding To A List

En outre, MVC Le classeur modèle 3 supportera J FILS données post, je pense - mais cela est évidemment pas pour vous aider aujourd'hui :(

0

Dans mon cas, la vue n'est pas retournée. Son montrant l'alerte dans le rappel

Questions connexes