Удалить косую черту между действием и строкой запросов (например, как ведет себя поиск SO) - PullRequest
4 голосов
/ 25 октября 2011

Я только что добавил некоторые функции поиска в мой проект, который работает правильно.Просто воспользовавшись поиском SO , я понял, что есть одна крошечная деталь, которую я предпочитаю своему собственному поиску, и мне стало интересно, как это достигается, поскольку я также использую MVC 3 *.1004 * и Razor для моего сайта.

Если я буду искать SO , я получу URL-адрес, например:

http://stackoverflow.com/search?q=foo

Однако поиск в моем собственном приложении приводит к:

http://example.com/posts/search/?searchTerms=foo

Обратите внимание на / между search и ?.Хотя это чисто косметически, как я могу удалить это из URL, чтобы оно выглядело как:

http://example.com/posts/search?searchTerms=foo

Это мой маршрут поиска:

routes.MapRoute(
    "SearchPosts",
    "posts/search/{*searchTerms}",
    new { controller = "Posts", action = "Search", searchTerms = "" }
);

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

1 Ответ

6 голосов
/ 25 октября 2011

Фактически, когда searchTerms может иметь значение null-or-emptyString, нет необходимости помещать его в mapRoute.И когда вы попытаетесь создать ссылку с помощью Html.ActionLink или Html.RouteLink и передать ей параметр searchTerms, он создаст searchTerms в виде строки запроса без косых черт:

routes.MapRoute(
    "SearchPosts",
    "posts/search",
    new { controller = "Posts", action = "Search"
    /* , searchTerms = "" (this is not necessary really) */ }
);

и в Razor:

// for links:
// @Html.RouteLink(string linkText, string routeName, object routeValues);
@Html.RouteLink("Search", "SearchPosts", new { searchTerms = "your-search-term" });
// on click will go to:
// example.com/posts/search?searchTerms=your-search-term
// by a GET command

// or for forms:
// @Html.BeginRouteForm(string routeName, FormMethod method)
@using (Html.BeginRouteForm("SearchPosts", FormMethod.Get)) {
    @Html.TextBox("searchTerms")
    <input type="submit" value="Search" />

    // on submit will go to:
    // example.com/posts/search?searchTerms=*anything that may searchTerms-textbox contains*
    // by a GET command

}

и в контроллере:

public class PostsController : Controller {
    public ActionResult Search(string searchTerms){
        if(!string.IsNullOrWhiteSpace(searchTerms)) {
            // TODO
        }
    }
}
...