... и маршрут всегда будет совпадать.

я есть форма на сайте asp.net mvc, которая служит 3 целям: разбиение по страницам, сортировка и поиск. Все эти элементы должны отображаться в одной и той же форме, поскольку возвращение правильных результатов поиска зависит от переменных всех трех аспектов. То, что я пытаюсь сделать, это переместить параметры из строки запроса и поместить их в канонический URL.

Я почти там, вот мои 3 конфигурации маршрута (использующие T4MVC для имен областей, контроллеров и действий):

context.MapRoute(null,
    "my-area/my-widgets/search/{size}-results-max/page-{page}/order-by-{sort}",
    new
    {
        area = MVC.MyArea.Name,
        controller = MVC.MyArea.MyWidgets.Name,
        action = MVC.MyArea.MyWidgets.ActionNames.Search,
        page = UrlParameter.Optional,
        size = UrlParameter.Optional,
        sort = UrlParameter.Optional,
    }
);

context.MapRoute(null,
    "my-area/my-widgets/canonicalize-search",
    new
    {
        area = MVC.MyArea.Name,
        controller = MVC.MyArea.MyWidgets.Name,
        action = MVC.MyArea.MyWidgets.ActionNames.CanonicalizeSearch,
    }
);

context.MapRoute(null,
    "my-area/my-widgets",
    new
    {
        area = MVC.MyArea.Name,
        controller = MVC.MyArea.MyWidgets.Name,
        action = MVC.MyArea.MyWidgets.ActionNames.CanonicalizeSearch,
    }
);

Форма в представлении отправляется в маршрут CanonicalizeSearch, используя этот синтаксис:

@using (Html.BeginForm(MVC.MyArea.MyWidgets.CanonicalizeSearch(), 
    FormMethod.Get))

В MyWidgetsController есть 2 метода действия:

[ActionName("canonicalize-search")]
public virtual RedirectToRouteResult CanonicalizeSearch(string keyword, 
    int page = 1, int size = 10, string sort = "Title-Ascending")
{
    var result = RedirectToRoutePermanent(new
    {
        area = MVC.MyArea.Name,
        controller = MVC.MyArea.MyWidgets.Name,
        action = MVC.MyArea.MyWidgets.ActionNames.Search,
        page = page,
        size = size,
        sort = sort,
        keyword = keyword,
    });
    return result;
}

[ActionName("search")]
public virtual ViewResult Search(string keyword, 
    int page = 1, int size = 10, string sort = "Title-Ascending")
{
    // code to perform query
    return View(model);
}

Это работает для перемещения всех переменных строки запроса в канонизированный маршруткроме ключевого слова, Если я добавлю параметр ключевого слова в первый маршрут, действие CanonicalizeSearch будет перенаправлено на действие «Поиск» только в том случае, если ключевое слово не является пустым или пустым. Это не хорошо, так как делает невозможным просмотр результатов на странице, когда не введено ключевое слово.

Я думаю, что я все перепробовал - присвоение ключевому слову значения по умолчанию в контроллере, добавление 4-го маршрута, который добавляет ключевое слово к остальным 3 параметрам, и т. Д. Однако единственный способ, которым я могу это заставить работать, - это сохранить ключевое слово как параметр строки запроса. (На самом деле я могу заставить его работать, добавив подчеркивание к ключевому слову в CanonicalizeSearch и убрав его в поиске, но это довольно забавно).

Любая помощь?

Ответы на вопрос(2)

Ваш ответ на вопрос