2010-12-09 40 views
4

Dans ASP.NET MVC 2, vous pouvez utiliser cette URL et cette méthode de commande:Dans ASP.NET MVC 2, puis-je désérialiser une chaîne de requête dans un tableau à l'aide du modèle par défaut ModelBinder?

GET http://server/controller/get?id=5 

public ActionResult Get(int id) 
{ 
    ... 
} 

Et le ModelBinder convertira le id=5 queryString à id = (int) 5 dans le paramètre de la méthode. Cependant, cela ne fonctionnera pas:

GET http://server/controller/get?idlist=1,2,3,4,5 

public ActionResult Get(int[] idlist) 
{ 
    ... 
} 

idlist sera nulle dans le paramètre. Bien que l'analyse de ce soit assez trivial, je me demandais s'il y avait un moyen de changer la signature de la méthode ou la chaîne de requête afin que ModelBinder par défaut désérialise automatiquement les tableaux/collections?

Répondre

8

Avec le ModelBinder par défaut, l'URL doit être

http://server/controller/get?idlist=1&idlist=2&idlist=3&idlist=4&idlist=5 

ou

http://server/controller/get?idlist[]=1&idlist[]=2&idlist[]=3&idlist[]=4&idlist[]=5 

Si vous voulez vraiment utiliser idlist = 1,2,3,4,5, vous devriez avoir votre propre liant

+1

Aïe, je vais en tenir à 'idlist.Split (« ») .Sélectionnez (x => Convert.ToInt32 (x)); –

+2

Le modelbinder par défaut ne prend pas en charge le second exemple. – MartinF

-4

Voici ce que je pense:

public ActionResult Get(int id) 
{ 
    ... 
} 

devrait être utilisé comme

GET http://server/controller/get/5 

Et le idlist peut être simplement divisé par une virgule (,)

+0

Comment votre identifiant entier va-t-il contenir une liste délimitée par des virgules? – andynormancx

+0

Pourquoi ne pas simplement le rendre plus facile en passant une liste de chaînes. Je pense que ce devrait être vraiment facile à faire. Ai-je raison? –

+1

Cela ne répond même pas à distance à ma question. –

-1
Ce

est un peu en retard à la fête, mais je voulais faire exactement la même chose.

Vous pouvez passer la chaîne unique comme {1,2} et le liant se lier à un tableau par exemple

<input name="idlist" type="text" value="{163,162}">