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?