2009-06-30 9 views
5

je le cas suivant où je veux accepter les déroutes suivantesasp.net mvc - Route pour chaîne ou int (ie/type/23 ou/type/chapeaux)

'/type/view/23' or '/type/view/hats' 

où 23 est l'ID pour les chapeaux.

Le contrôleur ressemble à ceci:

public class TypeController 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult View(int id) 
    { 
     ... 
    } 
} 

Maintenant, s'ils passent en 23 aucun problème. S'ils passent en chapeaux, j'ai du travail à faire. Maintenant, je me demandais dans ce cas si je traduisais chapeaux à 23 en utilisant un ActionFilter qui cherche à voir si la valeur transmise comme l'ID est un int (si c'est le cas vérifier qu'il existe dans la base de données) ou si c'est une chaîne la base de données pour ce que l'ID de la chaîne qui a été transmis est. Dans les deux cas, si une correspondance n'est pas trouvée, je voudrais rediriger l'utilisateur vers une action différente.

Premièrement, l'approche que j'ai nommée correcte, deuxièmement est-il possible de faire une redirection à partir d'un ActionFilter.

Vive Anthony

Répondre

4

Modifiez votre signature pour accepter une chaîne. Ensuite, vérifiez si la valeur de id est un int. Si c'est le cas, recherchez par ID, sinon recherchez par nom. Si vous ne trouvez pas de correspondance, faites votre redirection.

public class TypeController 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult View(string id) 
    { 
     Product product = null; 
     int productID = -1; 
     if (int.TryParse(id, out productID)) 
     { 
      product = db.Products 
         .Where(p => p.ID == productID) 
         .SingleOrDefault(); 
     } 
     else 
     { 
      product = db.Products 
         .Where(p => p.Name == id) 
         .SingleOrDefault(); 
     } 

     if (product == null) 
     { 
      return RedirectToAction("Error"); 
     } 
     ... 
    } 
} 

La raison pour laquelle je ferais ce que pour savoir ce que le contrôleur/actions à appliquer, le cadre va chercher un qui correspond à la signature des données d'itinéraire qui est passé. Si vous n N'avez pas une signature qui correspond - dans ce cas, une chaîne qui prend une chaîne - vous obtiendrez une exception avant que l'un de vos filtres ne soit invoqué. Malheureusement, je ne pense pas que vous puissiez en avoir une qui prend une chaîne et une autre qui prend un int - dans ce cas, le framework ne sera pas capable de dire lequel devrait correspondre si un seul paramètre est passé, du moins s'il est un nombre, c'est. En en faisant un paramètre de chaîne et en gérant vous-même la traduction, vous permettez au framework de faire son travail et vous obtenez le comportement que vous voulez - aucun filtre nécessaire.

+1

Penser à trouver un moyen pour le cadre pour faire le travail, pourrais-je avoir deux déroutes comme ce qui suit: this._Routes.MapRoute (« TypeInt » , "type/view/{id}", nouveau {controller = "Type", action = "ViewInt"}, nouveau {page = @ "^ \ d + $"}); this._Routes.MapRoute ("TypeString", "type/view/{id}", nouveau {controller = "Type", action = "ViewString"}); Serait-il utile de le faire? ou pensez-vous juste faire l'essai parse? –

+0

Je ne vois pas ce que vous gagnez en ajoutant de la complication à l'infrastructure de routage, sauf qu'elle fait l'analyse pour vous. Je ne suis pas assez intelligent pour savoir si cela fonctionnerait sans vraiment le tester.Personnellement, j'aurais probablement deux actions différentes View et ViewByName, qui utilisent toutes deux la même méthode privée pour générer les données une fois que le produit correct a été trouvé. Pour moi, ce serait encore plus simple et plus clair. – tvanfosson

0

Incertain vous pouvez le faire. Je pense que vous auriez besoin de passer une chaîne, puis vérifier pour voir si c'est un numérique, mais il pourrait y avoir une meilleure façon.

Comme pour rediriger l'utilisation

return RedirectToAction("MyProfile", "Profile"); 

Vous pouvez transmettre des valeurs d'itinéraire dans le cadre de l'appel RedirectToAction afin que vous puissiez passer dans les années ou les noms id etc si c'est ce qui est nécessaire.

Il y en a d'autres comme rediriger vers des routes qui peuvent également être utiles pour ce que vous voulez.

+0

Avec la réorientation je pensais à le faire à partir du ActionFilter –

Questions connexes