necesita ayuda para canonizar un formulario HTTP GET en asp.net mvc

Tengo un formulario en un sitio asp.net mvc que tiene 3 propósitos: paginación, clasificación y búsqueda. Todos estos elementos deben representarse de la misma forma, ya que devolver los resultados de búsqueda correctos depende de las variables de los 3 aspectos. Lo que intento hacer es mover los parámetros fuera de la cadena de consulta y ponerlos en una URL canónica.

Ya casi estoy allí, aquí están mis 3 configuraciones de ruta hasta ahora (usando T4MVC para nombres de área, controlador y acción):

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,
    }
);

El formulario en la vista se envía a la ruta CanonicalizeSearch, utilizando esta sintaxis:

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

En MyWidgetsController, hay 2 métodos de acción:

[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);
}

Esto funciona para mover todas las variables de cadena de consulta a una ruta canonicalizadaa excepción de la palabra clave. Si agrego un parámetro de palabra clave a la primera ruta, la acción CanonicalizeSearch solo redirige a la acción Buscar cuando la palabra clave no es nula, vacía o en blanco. Esto no es bueno ya que hace que los resultados de la página de navegación sean imposibles cuando no se ingresa una palabra clave.

Creo que lo he intentado todo: dar a la palabra clave un valor predeterminado en el controlador, agregar una cuarta ruta que agrega palabras clave a los otros 3 parámetros, etc. Sin embargo, la única forma en que puedo hacer que esto funcione es manteniendo la palabra clave como un parámetro de cadena de consulta. (En realidad, puedo hacer que funcione al anteponer un guión bajo a la palabra clave en CanonicalizeSearch y eliminarlo en la búsqueda, pero eso es bastante extravagante).

¿Alguna ayuda?

Respuestas a la pregunta(2)

Su respuesta a la pregunta