2010-10-11 10 views
2

Comment est-ce que je devrais définir l'itinéraire dans mon global.asax pour pouvoir utiliser les paramètres nullable et la virgule comme séparateur?ASP.NET Mvc - paramètres nullable et virgule comme séparateur

Je suis en train de mettre en œuvre des règles de routage pour mes utilisateurs de la recherche page comme

"{Controller}/{Action},{name},{page},{status}" 

Notice complète du Global.asax:

routes.MapRoute(
     "Search", 
     "{controller}/{action},{name},{page},{status}", 
      new { controller = "User", action = "Find", 
       name = UrlParameter.Optional, 
       page = UrlParameter.Optional, 
       status = UrlParameter.Optional } 
    ); 

routine défini comme ci-dessus fonctionne très bien quand je suis entrer tous les paramètres, mais lorsque certains paramètres sont égaux à un routage nul échoue (par exemple "user/find ,,,")


Selon Clicktricity commentaire ci-dessous - la singature de la méthode d'action qui handes la demande:

public ActionResult Find(string userName, int? page, int? status) 
{ 
    // [...] some actions to handle the request 

} 

Au début, je testais la route par VS débogueur, maintenant je suis en utilisant débogueur d'itinéraire décrit sur Phil's Haack blog. L'outil confirme - que le routage avec des valeurs NULL n'est pas correctement géré (ou que je fais quelque chose de mal;))

+0

Quelle est la définition de votre action du contrôleur? Permet-il des valeurs nullables? – Clicktricity

+0

Cela fonctionne-t-il si vous utilisez des barres obliques? Il y a une discussion que vous pourriez vouloir lire ici http://stackoverflow.com/questions/198606/can-i-use-commas-in-a-url – Ryan

Répondre

4

Pour autant que je sache, le routage .Net ne vous permet pas de faire plusieurs paramètres NULL comme ça. Plusieurs paramètres ne fonctionneront que si elles manquent de travail en arrière à partir de la fin et avec le séparateur manquant aussi de sorte que vous obtiendriez matchs sur

user/find,bob,2,live 
user/find,bob,2 
user/find,bob 
user/find

Ce serait beaucoup plus facile à utiliser pour querystrings ce que vous essayez faire.

Modifier basé sur le commentaire:

Si cela est nécessaire alors vous pourriez essayer de le faire de cette façon (bien que ce n'est pas une approche agréable)

Changer votre chemin pour correspondre

{Controller}/{Action},{*parameters}

Assurez-vous de mettre une contrainte sur l'action et le contrôleur afin que cela soit aussi limité que possible. Renommez chaque action qui porterait votre liste complète à quelque chose d'autre, en ajoutant un préfixe standard à chacun d'eux serait le plus propre, et ajoutez l'attribut [NonAction]. Ajoutez une nouvelle méthode avec le nom d'origine qui prend une chaîne, cette chaîne est une chaîne séparée par des virgules de vos variables. Dans cette méthode, divisez la chaîne et renvoyez l'action originale en passant les valeurs de la scission.

Alors vous allez de:

public ActionResult Find(string name, int page, string status){ 
    //Do stuff here 
    return View(result); 
} 

Pour

public ActionResult Find(string parameters){ 
    string name; 
    int? page; 
    string status; 
    //split parameters and parse into variables 
    return FindAction(name, page, status); 
} 

[NonAction] 
public ActionResult FindAction(string parameters){ 
    //Do what you did in your previous Find action 
    return View(results); 
} 
+0

Merci pour la réponse. Je m'attendais à ce que ce ne soit pas possible directement. Je sais que je peux obtenir des valeurs param à partir de la chaîne de requête, mais mon client a besoin de transmettre les données comme indiqué ci-dessus. –

+0

Voir la réponse mise à jour. – Chao

+0

Thanx Chao.J'ai trouvé quelque chose de similaire mais mon chemin était moche comparé à votre version. Encore merci;) –