2012-06-13 3 views
4

У меня есть некоторые проблемы с маршрутизацией в моем приложении ASP.NET MVC3, именно так оно и не работает.Как исправить мою маршрутизацию MVC3

определение маршрутизации в Global.asax

routes.MapRoute(
      "News", // Route name 
      "{lang}/{controller}/{action}/{page}/{id}", // URL with parameters 
      new { lang = "pl", controller = "News", action = "Index", page = 1, id = UrlParameter.Optional } // Parameter defaults 
     ); 

Так что я хочу использовать его в 2 ситуации:

  1. /{lang}/{controller}/{action}/{page} - чтобы перейти на страницу специфической вёрстки
  2. /{lang}/{controller}/{action}/{page}/{id} - запомнить текущую страницу, и перейдите на страницу с конкретными id.

генерировать ссылки Я использую:

@Html.RouteLink(i.ToString(), "News", new { lang = ViewBag.Lang, page = i }) 

где i это номер страницы, и Ланг язык.

В контроллер я справиться с этим ведьма Действие:

public ViewResult Index(string lang, int page = 1) 

ПРОБЛЕМА

@Html.RouteLink дает мне ссылку /pl/News/Index/2 (когда '2' была нажата), но мой контроллер не обрабатывает он и страница по-прежнему «1». Поэтому, когда я дважды нажимаю одну и ту же ссылку, она дает: /pl/News/Index/2/2, а затем страницу равна «2».

Если кто-нибудь может объяснить мне, как это работает, и что я могу сделать для его решения?

Любая помощь будет оценена по достоинству.

+0

Вот некоторые нечестивые пути, но то, что я не видите в вашем контроллере 'id' (который является необязательным), не следует ли это' Index (string lang, int? id, int page = 1) '? :) –

+0

Вы не читаете внимательно :) В действии индекса я не использую параметр 'id', мне это нужно только для другого Action. –

+1

Если я правильно понимаю, вы нажимаете '/ pl/News/Index/2', он запускает правильное действие _Index_, но значение _page_ внутри этого действия равно 1 вместо 2. Нет ли других маршрутов, которые могут соответствовать этому ссылка? –

ответ

2

Я думаю, что вам не хватает здесь, что система маршрутизации использует значения переменных из текущего запроса для генерации исходящих правил.

Например - если вы на странице/PL/Новости/Index/2 у вас есть

lang = "pl", controller = "News", action = "Index", page = 2 

, если попытаться создать правило, подобное этому

@Html.RouteLink(i.ToString(), "News") 

система маршрутизации будут использовать уже существующие переменные, такие как lang и страница и будут генерировать точно такой же URL-адрес// Новости/Индекс/2.

Конечно, значения, которые вы передаете анонимному типу в Html.RouteLink обрабатываются с приоритетом и переопределяете значения из текущего запроса. Поэтому в вашем примере вы должны рассмотреть , какой URL-адрес у вас есть при создании ссылки.

Порядок старшинства:

  1. переменные передаются в анонимный тип
  2. переменные запроса
  3. значения по умолчанию, определенные в маршруте.

кажется, что эта часть

lang = ViewBag.Lang 

бесполезно, так как языки будут взяты из запроса, если не поставить его - так он будет сохранен.

Update (может быть не применимо):

Вы также должны иметь в виду, что если у вас есть более чем один матч за правило - система маршрутизации будет выбрать первый, который удовлетворяет ограничениям (например, значение из запроса следует не конфликтует с переменными по умолчанию)

UPDATE2:

система маршрутизации использует переменный запрос вплоть до первого явно указать переменный (через анонимный тип), так что если вы задаете Ланг явно - нет запроса переменные не будет использоваться повторно (в вашем случае, потому что языков является первым сегментом в вашем URL)

+0

Спасибо за ответ, но я не уверен, что я тебя понимаю. Вы предлагаете мне сменить? Также, когда я использую '@ Html.RouteLink' и укажу конкретное имя маршрута, он принимает правильное правило, не так ли? Но я вижу, что он не перезаписывает значение 'page'. Но что я должен делать, это так? –

+0

@MateuszRogulski - да, когда вы используете RouteLink, оно использует указанное правило (поэтому я упоминаю, что мое обновление не относится к вашему делу). Не могли бы вы опубликовать весь код (все правила, все действия и полный вид). Я просто попробовал ваше правило с новым проектом MVC, и он отлично работает (значение страницы переопределено). – Bond

+0

Требуется неправильное правило маршрута. Но в этом случае я не знаю, как работает '@ Html.RouteLink', потому что он получает маршрут по умолчанию.Но я решаю это, изменяя правила маршрута. Спасибо за помощь. –

0

Я думаю, что часть вашего проблема в том, что вы нарушаете соглашение немного, и поскольку MVC полагается на соглашение для успешной маршрутизации, ваше сопоставление немного перегружено.

Я хотел бы предложить переписывать маршрутизацию так:

routes.MapRoute(
      "News", // Route name 
      "{controller}/{action}/{lang}/{id}/{page}", // URL with parameters 
      new { controller = "News", action = "Index", lang = "pl", page = 1, id = UrlParameter.Optional } // Parameter defaults 
     ); 

Похоже, что наиболее распространенным сценарием для URL будет что-то вроде:

http://yourdomainhere/news/pl/some-sort-of-permalink/1 
+0

Спасибо, но не было ничего, что могло бы решить мою проблему. –