2009-08-19 6 views
2

Je me sers de ce quelque temps maintenant, mais je ne peux pas l'air de comprendre, où pourrait être erreur dans ce code simple:routage ASP.NET MVC Url.Action erreur

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

Avec cette table de routage:

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

Et bien sûr, cette méthode

public ActionResult Index(int? page) 

Je reçois au lieu d'adresse prévu http://localhost:58296/Home/Page/1 une http://localhost:58296/Home/Page?page=1

Lorsque vous utilisez

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

cela fonctionne .. S'il vous plaît, où est mon erreur? Je veux un lien d'image, donc s'il y a un moyen de l'insérer dans Html.RouteLink, j'apprécierais aussi cette information.

Merci d'avance.

+0

Quelle action utilisez-vous exactement - Home.Paging ou Home.Index? –

+0

J'utilise Home.Index. La pagination est juste le nom de l'entrée de la table de routage. – Trimack

Répondre

8

Il y a un tas d'éléments à couvrir ici pour que vous compreniez parfaitement ce qui se passe. Désolé, ce sera un peu long.

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

Tout d'abord, c'est la route que vous voulez atteindre. Vous n'incluez pas le paramètre de route d'action, '{action}', dans le chemin d'accès. La seule action que cette route peut éventuellement prendre est la valeur que vous avez spécifiée comme valeur d'action par défaut "Index". Deuxièmement, dans votre lien vous définissez une action de Page. La route que vous attendez n'accepte pas l'action en tant que paramètre et la seule action dont elle a connaissance est Index. Lorsque Url.Action recherche des routes possibles dans votre table de routage, il ignore l'itinéraire que vous souhaitez car cette route n'accepte pas une action de Page. La route par défaut est cependant valide car vous fournissez implicitement un contrôleur, Home, fournissant explicitement une action, Page, permettant au framework de fournir une valeur par défaut pour id, string.Empty, et tous les autres paramètres sont affichés comme paramètres de requête, page. Lorsque vous avez modifié l'Url.Action en "Index", la méthode Url.Action a inspecté la table routes et a trouvé la route avec l'action de l'index spécifié pour le contrôleur Home avec un paramètre de page et tout est plus heureux.

Espérons que cela aide et n'est pas trop confus.

2

Je ne sais pas pourquoi, mais

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

fonctionne et il affiche et dirige à/Accueil/Page/1. Si quelqu'un pouvait me l'expliquer, je serais reconnaissant.