Frage

Ich bin mit dem MVC-Beta eine einfache Anwendung schreiben ASP.Net MVC zu verstehen. Die Anwendung ist eine einfache Foto / Video-Sharing-Site mit Tagging. Ich arbeite das MVC-Skelett-Projekt ab. Ich habe einige Html.ActionLink () ‚s auf die Navigationsleiste, aber ich habe ein Problem mit einem des Html.ActionLink mit ()‘ s, dass ich an einer Stelle hinzugefügt.

Ich mag ~ / Stichworte Alle Tags aus der Datenbank zeigen, und ich mag ~ / Tags / {tag} eine Auflistung aller Dateien anzuzeigen, die mit {tag} markiert. Dies funktioniert wie erwartet, aber wenn ich einen ~ / Tags / {tag} folgen, ändert es die Html.ActionLink () in der Navigationsleiste die gleiche wie der ~ / Tags / {tag} Link sein statt auf nur ~ /Stichworte. Verstehe ich nicht, warum der Actionlink () in meiner Navigationsleiste zu ändern, wenn ich die folgen ~ / Tags / {tag}. Wenn ich auf einen anderen Link im Projekt navigieren, der Actionlink () funktioniert wie erwartet.

Ich habe die Action und Route wie folgt aufgebaut. Mein TagsController hat diesen Index Aktion. Der int? ist für eine Funkrufsteuerung. Ich habe zwei Ansichten, eine namens All und ein genannt Einzelheiten. Was mache ich falsch?

        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) 
        }
War es hilfreich?

Lösung

Ich glaube, Sie brauchen eine Instanz von yoursite.com/Tags/ zu handhaben, da Sie nur ein mit einem Tag in der Handhabung sind.

Ich würde eine andere Route erstellen:

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

Andere Tipps

Darüber hinaus eine zusätzliche Route zu erstellen, wie Dan Atkinson erwähnt, sollen Sie auch in der Steuerung loszuwerden, die if-Anweisung erhalten und eine andere Controller-Methode erstellen (genannt Details) den Tag Details zu behandeln. if-Anweisungen in einem Controller zu bestimmen, welche zu zeigen, sehen ist ein Code Geruch. Lassen Sie das Routing-Engine seine Arbeit tun und Ihr Controller-Code wird einfacher und leichter zu pflegen.

Ich würde vorschlagen, dass Sie in Lamda Ausdrücke suchen, dies zu umgehen, können Sie mit einer ‚Tag Suppe‘ in Zukunft enden.

Also, stellen Sie sicher, dass Sie die Microsoft.Web.Mvc dll heruntergeladen haben, unterscheidet sich von System.Web.Mvc.

Wo bekommt man Microsoft.Web.Mvc.dll

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top