No projeto de exemplo do MVC3, os links de navegação são frequentemente gerados com parâmetros de consulta, como http://xxx/?category=watersport. Para transformá-los em URLs limpas, como http://xxx/watersport, é essencial ajustar as rotas e atualizar as views.
Definição de Rotas
Modiifque o arquivo de configuração de rotas (ex.: RouteConfig.cs) para incluir rotas que suportem URLs amigáveis:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "CategoryClean",
url: "{category}",
defaults: new { controller = "Product", action = "List", page = 1 }
);
routes.MapRoute(
name: "CategoryPaged",
url: "{category}/Page{page}",
defaults: new { controller = "Product", action = "List" },
constraints: new { page = @"\d+" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Product", action = "List", id = UrlParameter.Optional }
);
Essa configuração direciona requisições como /watersport para a ação List do controlador Product, passando a categoria via segmento de URL.
Atualização do Controlador
Ajuste o controlador de navegação para refletir novos nomes de parâmetros e lógica:
public class MenuController : Controller
{
private readonly IProductRepo _data;
public MenuController(IProductRepo dataRepository)
{
_data = dataRepository;
}
public ActionResult NavigationMenu(string activeCat = null)
{
ViewBag.CurrentCategory = activeCat;
var categoryList = _data.GetProducts()
.Select(item => item.Category)
.Distinct()
.OrderBy(cat => cat);
return PartialView(categoryList);
}
}
Aqui, a classe foi renomeada para MenuController, o parâmetro para activeCat, e o repositório acessado via método GetProducts().
Modificação da View
Na view Razor NavigationMenu.cshtml, utilize Html.RouteLink com o nome da rota definida:
@model IEnumerable<string>
@{
Layout = null;
}
<a href="@Url.Action("List", "Product")">Início</a>
@foreach (var catLink in Model)
{
@Html.RouteLink(
linkText: catLink,
routeName: "CategoryClean",
routeValues: new { category = catLink },
htmlAttributes: new { @class = catLink == ViewBag.CurrentCategory ? "active" : "" }
)
}
Ao usar "CategoryClean" como nome da rota, os links gerados adotam o formato /catLink, eliminando os parâmetros de consulta. Este método garante URLs mais limpas e amigáveis.