2009-08-19 1 views
2

Я использовал это некоторое время, но я не могу показаться, чтобы выяснить, где может быть ошибка в этом простом коде:ASP.NET MVC Url.Action ошибка маршрутизации

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

С этим таблица маршрутизации:

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

И, конечно же, этот метод

public ActionResult Index(int? page) 

Я получаю вместо ожидаемого адреса http://localhost:58296/Home/Page/1 одной http://localhost:58296/Home/Page?page=1

При использовании

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

это работает .. Пожалуйста, где моя ошибка? Я хочу ссылку на изображение, поэтому, если есть способ вставить ее в Html.RouteLink, я тоже буду использовать эту информацию.

Заранее спасибо.

+0

Какое действие вы используете точно - Home.Paging или Home.Index? –

+0

Я использую Home.Index. Пейджинг - это всего лишь название записи в таблице маршрутов. – Trimack

ответ

8

Здесь есть куча предметов, чтобы вы могли полностью понять, что происходит. Извините, это будет немного длиннее.

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

Во-первых, это маршрут, который вы хотите поразить. Вы не включаете параметр маршрута действия, {{действие} ', в маршрут маршрута. Единственное действие, которое может предпринять этот маршрут, - это значение, которое вы указали как значение действия по умолчанию «Индекс».

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

Во-вторых, в вашей ссылке вы устанавливаете действие страницы. Маршрут, который вы ожидаете, не принимает действие в качестве параметра, и единственным действием, о котором он знает, является индекс. Когда Url.Action ищет возможные маршруты в таблице маршрутов, он пропустит нужный маршрут, потому что этот маршрут не принимает действие страницы. Маршрут по умолчанию действителен, хотя из-за того, что вы неявно поставляете контроллер Home, явно предоставляя действие, страницу, позволяющую фреймворку предоставлять значение по умолчанию для id, string.Empty и любых других параметров, на которые ссылаются как параметры запроса, страница.

Когда вы изменили Url.Action на «Index», метод Url.Action проверил таблицу маршрутов и нашел маршрут с указателем Index, указанным для Домашнего контроллера, с параметром страницы, и все более счастливо.

Надеюсь, что это помогает и не слишком запутывает.

2

Я не знаю, почему, но

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

работает и отображает и направляет в/Home/Page/1. Если бы кто-нибудь мог объяснить это мне, я был бы признателен.