Question

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

Je veux que ~ / Tags affiche toutes les balises de la base de données et je veux que ~ / Tags / {tag} affiche une liste de tous les fichiers marqués avec {tag}. Cela fonctionne comme prévu, mais lorsque je suis un ~ / Tags / {tag}, cela modifie le Html.ActionLink () dans la barre de navigation pour qu'il soit identique au lien ~ / Tags / {tag} au lieu de simplement pointer vers ~ /Mots clés. Je ne comprends pas pourquoi ActionLink () dans ma barre de navigation change lorsque je suis ~ / Tags / {tag}. Si je navigue vers un lien différent dans le projet, ActionLink () fonctionne comme prévu.

J'ai le lien action et la route configurés comme ceci. Mon TagsController a cette action Index. L'int est pour un contrôle de pagination. J'ai deux vues, l'une appelée Tous et l'autre 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) 
        }
Était-ce utile?

La solution

Je pense que vous devez gérer une instance de yoursite.com/Tags/, car vous n'en manipulez qu'une avec une balise.

Je créerais une autre route:

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);
}

Autres conseils

En plus de créer une route supplémentaire comme le mentionne Dan Atkinson, vous devez également vous débarrasser de l'instruction if dans le contrôleur et créer une autre méthode de contrôleur (appelée Details) pour gérer les détails de la balise. Si les instructions dans un contrôleur pour déterminer quelle vue à afficher sont une odeur de code. Laissez le moteur de routage faire son travail et votre code de contrôleur sera plus simple et plus facile à gérer.

Je suggérerais que vous examiniez les expressions Lamda pour gérer cela, vous pourriez vous retrouver avec une "soupe de balises" à l'avenir.

Assurez-vous également que vous avez téléchargé la dll Microsoft.Web.Mvc, différente de System.Web.Mvc.

Où obtenir Microsoft.Web.Mvc.dll

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top