preciso de ajuda para canonizar um formulário HTTP GET no asp.net mvc

Eu tenho um formulário em um site asp.net mvc que serve três propósitos: paginação, classificação e pesquisa. Todos esses itens devem ser renderizados da mesma forma, pois o retorno dos resultados corretos da pesquisa depende das variáveis dos três aspectos. O que estou tentando fazer é mover os parâmetros para fora da string de consulta e colocá-los em um URL canônico.

Estou quase lá, aqui estão minhas três configurações de rota até agora (usando T4MVC para nomes de área, controlador e ação):

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

O formulário na exibição é enviado para a rota CanonicalizeSearch, usando esta sintaxe:

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

No MyWidgetsController, existem 2 métodos de ação:

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

Isso funciona para mover todas as variáveis de querystring para uma rota canonizadaexceto a palavra-chave. Se eu adicionar um parâmetro de palavra-chave à primeira rota, a ação CanonicalizeSearch somente redirecionará para a ação Pesquisar quando a palavra-chave não for nula, vazia ou em branco. Isso não é bom, pois impossibilita os resultados da página de navegação quando nenhuma palavra-chave é inserida.

Acho que tentei de tudo - atribuir à palavra-chave um valor padrão no controlador, adicionar uma quarta rota que adicione a palavra-chave aos outros três parâmetros, etc. No entanto, a única maneira de conseguir fazer com que isso funcione é mantendo a palavra-chave como um parâmetro querystring. (Na verdade, posso fazê-lo funcionar acrescentando um sublinhado à palavra-chave no CanonicalizeSearch e retirando-o na Pesquisa, mas isso é bastante hacky).

Qualquer ajuda?

questionAnswers(2)

yourAnswerToTheQuestion