itinéraires MVC à partager la même action?
-
06-07-2019 - |
Question
J'ai les deux itinéraires suivants définis dans mon application MVC.; - Pour le moment, je dispose de deux "MVC Afficher les pages de contenu". défini
/ShowName/NameById
/ShowName/Index
Cependant, le contenu de ces deux pages est identique? Est-il possible que deux itinéraires partagent la même page de contenu? Sinon, puis-je a) créer une seule règle pour les deux routes ou b) dois-je créer un contrôle utilisateur à partager entre les deux pages de contenu pour afficher mes données?
routes.MapRoute(
"NameById",
"Name/{theName}/{nameId}",
new
{
action = "NameById",
controller = "ShowName",
theName = "Charley"
}
,new { nameId = @"\d+" }
);
routes.MapRoute(
"ShowName",
"Name/{theName}",
new
{
action = "Index",
controller = "ShowName",
theName = "Charley"
}
);
MODIFIER J'ai lu les réponses ci-dessous et j'ai les méthodes de résultat d'action suivantes. Si je supprime l’une des méthodes (par exemple, l’Index), comment puis-je réécrire mes itinéraires sur un seul itinéraire?
public ActionResult Index(string theName)
public ActionResult NameById(string theName, int? nameId)
Donc, les travaux suivants fonctionnent le travail de l'URL?
/Name/Charley
/Name/Charley/11234
La solution
Avez-vous vraiment besoin de 2 itinéraires différents? Vous pouvez créer le modèle pour votre route d'index
Name/{theName}/{nameId}
et faites de nameId une entrée nullable pour votre action. Ajoutez simplement une logique à votre action pour vérifier si nameId a une valeur et agit en conséquence.
Autres conseils
Vous pouvez créer une vue partielle pour la zone de détail de la page, en conservant la séparation des deux actions au cas où elles changeraient ultérieurement. Ou vous pourriez simplement
return View("DetailView", model);
Mais cela peut introduire une chaîne supplémentaire à gérer entre les deux actions du contrôleur. Étant donné que MVC ne prend pas en charge la surcharge par nom d’action (sauf si vous avez une paire GET / POST, sans arguments), vous pouvez simplement vérifier le paramètre {nameId} et voir s’il est vide / null avant de l’utiliser.