2009-01-05 8 views
2

ASP.Net MVC Html.ActionLink() J'utilise la version bêta de MVC pour écrire une application simple à comprendre ASP.Net MVC. L'application est un simple site de partage de photos/vidéos avec marquage. Je travaille sur le projet MVC skeleton. J'ai ajouté quelques Html.ActionLink() à la barre de navigation, mais j'ai un problème avec l'un des Html.ActionLink() que j'ai ajouté en un seul endroit.problèmes

Je veux ~/tags pour afficher tous les tags de la base de données et je veux ~/tags/{tag} pour afficher une liste de tous les fichiers qui sont marqués avec {tag}. Cela fonctionne comme prévu, mais quand je suis un ~/Tags/{tag}, il change le Html.ActionLink() dans la barre de navigation pour être le même que le lien ~/Tags/{tag} au lieu de pointer vers ~ /Mots clés. Je ne comprends pas pourquoi le lien ActionLink() dans ma barre de navigation change lorsque je suis le ~/Tags/{tag}. Si je navigue vers un lien différent dans le projet, le lien ActionLink() fonctionne comme prévu.

J'ai la ActionLink et l'itinéraire mis en place comme celui-ci. Mon TagsController a cette action Index. L'int? est pour un contrôle de pagination. J'ai deux vues, une appelée Tous et une appelée Détails. Qu'est-ce que je fais mal?

 Html.ActionLink("Tags", "Index", "Tags") // In navigation bar 

     routes.MapRoute(
      "Tags", 
      "Tags/{tag}", 
      new 
      { 
       controller = "Tags", action = "Index", tag = "", 
      }); 

     public ActionResult Index(string tag, int? id) 
     { // short pseudocode 
      If (tag == "") 
      return View("All", model) 
      else 
      return View("Details", model) 
     } 

Répondre

4

Je pense que vous devez gérer une instance de yoursite.com/Tags/, comme vous manipulez une seule avec une étiquette dans

Je créerais un autre itinéraire.

routes.MapRoute(
    "TagsIndex", //Called something different to prevent a conflict with your other route 
    "Tags/", 
    new { controller = "Tags", action = "Index" } 
); 

routes.MapRoute(
    "Tags", 
    "Tags/{tag}", 
    new { controller = "Tags", action = "Tag", tag = "" } 
); 


/* In your controller */ 
public ActionResult Index() // You could add in the id, if you're doing paging here 
{ 
    return View("All", model); 
} 

public ActionResult Tag(string tag, int? id) 
{ 
    if (string.IsNullOrEmpty(tag)) 
    { 
    return RedirectToAction("Index"); 
    } 

    return View("Details", model); 
} 
+0

travaillé comme un charme. Votre réponse m'a donné un moment d'a-ha pour le routage. Merci! –

+0

Génial! Heureux d'avoir pu aider! –

0

Je vous suggère de regarder dans les expressions Lamda pour gérer cela, vous pouvez vous retrouver avec une « soupe tag » dans l'avenir.

Aussi, assurez-vous que vous avez téléchargé le dll Microsoft.Web.Mvc, diffère de System.Web.Mvc.

Where to get Microsoft.Web.Mvc.dll

2

En plus de créer une voie supplémentaire Dan Atkinson mentionne, vous devez également se débarrasser de l'instruction if dans le contrôleur et créer une autre méthode de commande (appelé détails) pour gérer les détails d'étiquette. si les instructions dans un contrôleur pour déterminer quelle vue afficher est une odeur de code. Laissez le moteur de routage faire son travail et votre code de contrôleur sera plus simple et plus facile à maintenir.

+0

la déclaration if ne se sentait pas bien, mais la fixation du routage s'est débarrassé de l'if. –