На веб-сайте, на котором я работаю, есть довольно сложные структуры маршрутизации, и мы испытываем некоторые трудности с работой с механизмом маршрутизации, чтобы создавать URL-адреса так, как они нам нужны, чтобы они были построены.
У нас есть страница результатов поиска, которая использует сопоставление шаблонов на основе RegEx для группировки нескольких переменных в один сегмент маршрута (например, "www.host.com/{structuralParameters" ), может быть следующим: "www.host.com/variableA -variableB-variableC", где переменные A-C являются необязательными). Это работает для нас хорошо после небольшой работы.
Проблема, с которой мы столкнулись, устраняет раздражающую функцию метода ActionLink: если вы укажете на тот же контроллер/действие, он сохранит существующие значения маршрута, хотите ли вы их или нет. Мы предпочитаем контролировать то, как выглядят наши ссылки, и в некоторых случаях не могут иметь существующие параметры. Примером может служить то, где наша основная навигационная страница ведет к странице результатов поиска без каких-либо параметров - по умолчанию поисковая страница, если хотите. Я говорю, что это раздражающая функция, потому что это редкий экземпляр ASP.Net MVC Framework, который, казалось бы, диктует реализацию без очевидной точки расширения - мы бы предпочли не создавать собственный код ActionLink для написания простой навигационной ссылки на нашей главной странице!
Я видел, как некоторые говорят, что вам нужно явно указать такие параметры как пустые строки, но когда мы попробуем это, он просто изменяет параметры из значений маршрута в параметры строки запроса. Мне не кажется правильным, что мы должны явно исключать значения, которые мы явно не передаем как параметры методу ActionLink, но если это наш единственный вариант, мы будем использовать его. Однако в настоящее время, если он отображается в строке запроса, нам бесполезно вводить параметры непосредственно в маршрут.
Я знаю, что наша структура маршрутизации раздражает эту проблему - у нас, вероятно, не было бы проблем, если бы мы использовали более простой подход (например, www.host.com/variableA/variableB/variableC), но наша структура URL-адресов не подлежит обсуждению - он был разработан для удовлетворения очень специфических потребностей, связанных с удобством использования, SEO и обмен ссылками/контентом.
Как мы можем использовать Html.ActionLink для создания ссылок на страницы без возврата к текущим данным маршрута (или, если возможно, для явного исключения сегментов маршрута), даже если эти ссылки приводят к тем же методам действий?
Если нам нужно явно исключать сегменты маршрута, как мы можем препятствовать тому, чтобы метод отображал маршруты в качестве параметров строки запроса?
Эта, казалось бы, небольшая проблема вызывает у нас удивительное количество горя, и я буду благодарна за любую помощь в ее решении.
EDIT: по просьбе LukLed, здесь пример вызова ActionLink:
// I've made it generic, but this should call the Search action of the
// ItemController, the text and title attribute should say "Link Text" but there
// should be no parameters - or maybe just the defaults, depending on the route.
//
// Assume that this can be called from *any* page but should not be influenced by
// the current route - some routes will be called from other sections with the same
// structure/parameters.
Html.ActionLink(
"Link Text",
"Search",
"Item",
new { },
new { title = "Link Text" }
);