2010-08-26 8 views
4

J'ai une méthode d'action qui ressemble à ceci:aide de la liste en tant que paramètre de chaîne de requête utilisant MVC

public ActionResult DoSomething(string par, IEnumerable<string> mystrings) 

Je voulais la carte à un URL en utilisant Url.Action, en passant mystrings dans le RouteValueDictionary. Cependant, cela ne donne qu'une chaîne de requête qui ne correspond qu'à mystrings.ToString().

Comment puis-je transmettre une liste dans la chaîne de requête? Y a-t-il des fonctionnalités dans MVC 2 qui supportent cela? CLARIFICATION: La méthode d'action est appelée à l'aide de GET et non de POST.

Il n'y a pas de problème pour ma méthode d'action pour analyser la chaîne de requête DoSomething? Mystrings = aaa & mystrings = bbb

Cependant, je ne peux pas générer ce en utilisant Url.Action. Le passage d'une liste génère la chaîne de requête suivante: mystrings = system.collections.generic.list% 601% 5bsystem.string% 5d

Y a-t-il un moyen de réaliser cela facilement?

Répondre

2

Oui. Model Binding To A List

EDIT: Ok, maintenant je vois où vous allez avec ça. Je ne pense pas que ASP.NET MVC a ce intégré car il est conçu pour générer des chaînes de requête à partir des valeurs de route qui ont des noms uniques. Vous devrez peut-être rouler le vôtre. Je voudrais créer une méthode d'extension sur IEnumerable<String> comme ceci:

public static class Extensions 
{ 
    public static string ToQueryString(this IEnumerable<string> items) 
    { 
     return items.Aggregate("", (curr, next) => curr + "mystring=" + next + "&"); 
    } 
} 

Ensuite, vous pouvez générer votre propre chaîne de requête comme ceci:

<%= Url.Action("DoSomething?" + Model.Data.ToQueryString()) %> 

Ce besoin de quelques ongles que vous devriez UrlEncode vos cordes et il crée un traîner "&", mais cela devrait vous donner l'idée de base.

+0

Eh bien, cela semble ne concerner que la liaison au modèle POST, que j'ai déjà utilisée. Cependant, il s'agit de la liaison au modèle GET et de la chaîne de requête. Je vais mettre à jour ma question pour clarifier. – Max

+0

L'avez-vous essayé? :) Je l'ai fait et ça fonctionne bien avec GET. En utilisant votre signature de méthode ci-dessus, essayez d'envoyer la chaîne de requête "mystrings = aaa & mystrings = bbb & mystrings = ccc" et voyez ce qu'il se passe. – PatrickSteele

+0

Eh bien, je peux appeler avec succès la méthode. Ce qui est assez logique, puisque c'est la même chose pour POST. Cependant, je ne peux pas générer ces chaînes de requête. Je voudrais utiliser Url.Action, mais ça ne marche pas, comme j'essaye de le faire. S'il vous plaît voir ma question mise à jour (à nouveau);) – Max

1

Que diriez-vous:

<%: Html.ActionLink("foo", "DoSomething", new RouteValueDictionary() { 
    { "mystrings[0]", "aaa" }, { "mystrings[1]", "bbb" } 
}) %> 

qui génère:

<a href="/Home/DoSomething?mystrings%5B0%5D=aaa&amp;mystrings%5B1%5D=bbb">foo</a> 

Ce n'est pas exactement l'URL que vous recherchez, mais il va se lier avec succès à votre action du contrôleur. Si vous souhaitez générer une URL sans les crochets, vous devrez lancer votre propre méthode d'assistance.

Questions connexes