2009-08-12 3 views
2

Ce que je veux faire est d'avoir une page à /Products/Details/{id}, qui route vers les détails de l'action sur ProductsController et également une page d'édition à /Products/Details/Edit/{id}.Routage ASP.NET MVC: Puis-je avoir un nom d'action avec une barre oblique?

J'ai essayé de le faire en utilisant [ActionName("Details/Edit")] sur l'action mais cela ne fonctionne pas.

+0

Pourquoi ne pas simplement l'appeler ÉditionDétails? – RichardOD

+0

Parce que cela ne correspond pas à l'URL que j'essaie d'atteindre. –

Répondre

5

Vous ne pouvez pas avoir une barre oblique dans le nom de votre action. Pourquoi ne pas avoir les actions suivantes?

  • /Produits/Détails/{id} -Pour affichage
  • /Produits/Edition/{id} -Pour modifier

Ma préférence serait de faire ce qui suit:

  • /Produits/{id}/Voir -Pour affichage
  • /Produits/{id}/Editer/modifier -Pour

Espérons que cela a du sens!

+0

car chaque produit a un nombre de vues. Détails, historique, documents, etc., Chacune de ces pages doit être présentée dans un formulaire de vue et d'édition. –

+1

Cependant j'aime bien le modèle de routage que vous décrivez./Products/{id}/Détails et/Produits/{id}/Détails/Modifier serait parfaitement acceptable. –

+0

J'irais même plus loin et enlèverais juste le/Details/pour regarder un produit ie/products/{id} et éditer pourrait être/products/edit/{id} – David

1

route Ajouter comme cette AVANT la valeur par défaut un:

routes.MapRoute(
    "DefaultWithDetails", 
    "{controller}/Details/{action}/{id}"}, 
    null); 
+0

+1 pour faire ce que JayArr a demandé, bien que je pense que sémantiquement La suggestion de Lewis est une meilleure idée. –

+0

James, oui. Je suis d'accord. Mais je répondais juste à la question :) –

1

Ce que vous pouvez faire est de cela. Configurez un nouvel itinéraire comme celui-ci avant l'itinéraire par défaut;

routes.MapRoute(
    "PRoute", 
    "{controller}/{action}/{action2}/{id}", 
    null 
); 

Ensuite, dans votre contrôleur de produits, faites comme ceci, notez que les noms des paramètres correspondent aux noms de la route.

public ActionResult Details(string action2, string id) 
{ 
    switch (action2) 
    { 
     case "edit": 
      // Do Something. 
      return View("edit"); 
     case "view": 
      // Do Something. 
      return View("view"); 
     default : 
      // Do Something. 
      return View("bad-action-error"); 
    } 
} 

Maintenant, l'action Details sera passée à l'action2 et l'ID à l'URL. Donc une URL comme/products/details/view/7 l'action details aura "view" et "7", alors vous pouvez utiliser une instruction switch ou if sur action2 pour continuer votre traitement. Cela peut maintenant facilement être étendu pour inclure d'autres sous-actions.