Вот как я решил свою проблему, может потребоваться небольшая адаптация, чтобы заставить ее работать, но я чувствовал, что могу получить то, что мне нужно, и просто использовать маршрутизацию более или менее нормально:
Выдержки из Apress Pro ASP.Net.MVC 3 Framework:
Значение должно быть доступно для каждой переменной сегмента, определенной в шаблоне URL.
Чтобы найти значения для каждой переменной сегмента, система маршрутизации сначала смотрит на
значения, которые мы предоставили (используя свойства анонимного типа), то
значения переменных для текущего запроса и, наконец, значения по умолчанию, определенные в
маршрут. (Мы вернемся ко второму источнику этих значений позже в этой главе.)
Ни одно из значений, которые мы указали для переменных сегмента, может не совпадать с
переменные только по умолчанию, определенные в маршруте. Это переменные, для которых по умолчанию
значения были предоставлены, но которые не встречаются в шаблоне URL. За
Например, в этом определении маршрута myVar является переменной только по умолчанию:
rout.MapRoute ("MyRoute", "{controller} / {action}",
new {myVar = "true"});
Чтобы этот маршрут соответствовал, мы должны позаботиться о том, чтобы не указывать значение для myVar или
убедитесь, что поставляемое нами значение соответствует значению по умолчанию.
Значения всех переменных сегмента должны удовлетворять ограничениям маршрута. Увидеть
раздел «Ограничение маршрутов» ранее в этой главе для примеров различных
виды ограничений.
Обычно я использовал правило о том, что маршрут не соответствует, если он не определяет сегмент, но имеет переменную по умолчанию, которая позволяет мне немного больше контролировать, был ли выбран маршрут для исходящей маршрутизации.
Вот мои фиксированные маршруты, обратите внимание, как я указываю значение для категории, которое никогда не будет действительным, и не указываю сегмент для категории. Это означает, что маршрут будет пропущен, если у меня есть категория, но будет использовать его, если у меня есть только страница:
routes.MapRoute(null, "receptionists/faq/{page}", new { controller = "Receptionist", action = "Faq", page = 1, category = (Object)null }, new { page = @"^\d+$" });
routes.MapRoute(null, "receptionists/faq/{category}/{page}", new { controller = "Receptionist", action = "Faq", page = 1 }, new { category = @"^\D+$", page = @"^\d+$" });
Для ссылок категории
@Html.ActionLink("All", "Faq", new { page = 1 })
@foreach (var category in Model.Categories)
{
@Html.ActionLink(category.DisplayName, "faq", new { category = category.DisplayName.ToLower(), page = 1 })
}
Для ссылок на страницы
@for (var p = 1; p <= Model.TotalPages; p++)
{
@Html.ActionLink(p.ToString(), "Faq", new { page = p, category = Model.CurrentCategory})
}