Страница поиска MVC маршрутизации (скрытое действие, без слешей, как SO) - PullRequest
6 голосов
/ 22 февраля 2011

Я хочу, чтобы мои поиски были такими же, как и в переполнении стека (т.е. без действий, без слешей):

mydomain.com/search                        --> goes to a general search page  
mydomain.com/search?type=1&q=search+text   --> goes to actual search results  

Мои маршруты:

routes.MapRoute(  
  "SearchResults",  
  "Search/{*searchType}",      --> what goes here???  
  new { action = "Results" }  
);  
routes.MapRoute(  
  "SearchIndex",  
  "Search",  
  new { action = "Index" }  
);  

Мой SearchController выполняет следующие действия:

public ActionResult Index() { ... }  
public ActionResult Results(int searchType, string searchText) { ... }  

Маршрут результатов поиска не работает. Я не хочу использовать подход "... / ...", который, кажется, используют все, потому что поисковый запрос не является ресурсом, поэтому я хочу получить данные в строке запроса, как я указал, без косая черта - точно так же, как и SO.

ТИА! Matt

1 Ответ

3 голосов
/ 22 февраля 2011

Вам не нужны два маршрута, потому что вы предоставляете параметры поиска в виде строки запроса.Просто выберите один маршрут поиска:

routes.MapRoute(
    "Search",
    "Search",
    new { controller = "Search", action = "Search" }
);

Затем запишите это действие контроллера

public ActionResult Search(int? type, string q)
{
    var defaultType = type.HasValue ? type.Value : 1;
    if (string.IsNullOrEmpty(q))
    {
        // perform search
    }
    // do other stuff
}

Основная часть этого метода в значительной степени зависит от условия поиска, требуются ли оба параметра при поиске содержимогоили просто q, и у вас есть значение по умолчанию для type.Помните, что индексация страницы может быть выполнена точно так же.

Использование параметров строгого типа (проверка правильности)

Конечно, вы можете создать класс, который может быть проверен, но имена свойств должны отражать этостроки запроса.Таким образом, у вас будет либо класс:

public class SearchTerms
{
    public int? type { get; set; }
    public string q { get; set; }
}

, и вы будете использовать тот же запрос с переменными запроса с одинаковыми именами, что и сейчас, либо иметь чистый класс и настроить свой запрос:

public class SearchTerms
{
    public int? Type { get; set; }
    public string Query { get; set; }
}

http://domain.com/Search?Type=1&Query=search+text
...