Configurando Rotas no MVC3 para URLs de Navegação Limpas

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.

Tags: asp.net-mvc3 Routing razor-views CSharp

Publicado em 6-30 03:42