2009-08-19 16 views
2

Ich habe das jetzt einige Weile, aber ich kann nicht scheinen, um herauszufinden, wo Fehler in diesem einfachen Code sein könnte:ASP.NET MVC Url.Action Routing-Fehler

<a href="<%= Url.Action("Page", new { page=(Model.PageIndex + 1) }) %>" >a</a> 

Mit diesem Routing-Tabelle:

routes.MapRoute(
      "Paging", 
      "Home/Page/{page}", 
      new { controller = "Home", action = "Index" } 
     ); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

Und natürlich diese Methode

public ActionResult Index(int? page) 

ich erhalte statt der erwarteten Adresse http://localhost:58296/Home/Page/1 einen http://localhost:58296/Home/Page?page=1

Wenn

mit
<%= Html.RouteLink("a", "Paging", new { page=(Model.PageIndex+1) }) %> 

es funktioniert .. Bitte, wo mein Fehler ist? Ich möchte Bildlink, also, wenn es eine Möglichkeit gibt, es in Html.RouteLink einzufügen, würde ich diese Informationen auch schätzen.

Vielen Dank im Voraus.

+0

Welche Aktion verwenden Sie genau - Home.Paging oder Home.Index? –

+0

Ich benutze Home.Index. Paging ist nur der Name des Routentabelleneintrags. – Trimack

Antwort

8

Es gibt eine Reihe von Elementen, die Sie hier abdecken können, um vollständig zu verstehen, was passiert. Tut mir leid, das wird ein bisschen lang sein.

routes.MapRoute(
    "Paging", 
    "Home/Page/{page}", 
    new { controller = "Home", action = "Index" } 
); 

Zuerst ist dies die Route, die Sie treffen möchten. Sie enthalten den Aktionsroute-Parameter '{action}' nicht im Routenpfad. Die einzige Aktion, die diese Route möglicherweise ausführen kann, ist der Wert, den Sie als Standardaktionswert "Index" angegeben haben.

<a href="<%= Url.Action("Page", new { page=(Model.PageIndex + 1) }) %>" >a</a> 

Zweitens, in Ihrem Link setzen Sie eine Aktion von Page. Die Route, die Sie erwarten, akzeptiert keine Aktion als Parameter, und die einzige bekannte Aktion ist Index. Wenn Url.Action nach möglichen Routen in Ihrer Routentabelle sucht, wird die gewünschte Route übersprungen, da diese Route keine Aktion von Page akzeptiert. Die Standardroute ist jedoch gültig, da Sie implizit einen Controller Home bereitstellen, der explizit eine Aktion page bereitstellt, sodass das Framework einen Standardwert für id, string.Empty angeben kann und alle anderen Parameter als Abfrageparameter angehängt werden.

Wenn Sie die Url.Action in "Index" geändert haben, hat die Url.Action-Methode die Roots-Tabelle überprüft und die Route mit der Aktion Index für den Home-Controller mit einem Parameter der Seite gefunden und alles ist glücklicher.

Hoffe, dass hilft und ist nicht zu verwirrend.

2

Ich weiß nicht, warum, aber

<%= Url.Action("Index", new { page=(Model.PageIndex + 1) }) %> 

Werke und es zeigt und leitet zu/Home/Seite/1. Wenn mir jemand das erklären könnte, wäre ich dankbar.