Recentemente recebi a seguinte solicitação de um cliente “Todas as URLs que conter palavras composta devem ser separas por hífen”, basicamente o cliente queria que as URLs que estavam definidas desta forma http:// dominiodosite /registerlogin ficassem desta forma http://dominiodosite/register-login , note que o padrão de rotas em ASP.NET MVC é http://dominiodosite/nomeController/nomedaaction/[id] e o que o cliente quer é http://dominiodosite/nome-da-action/ ,essa regra também é valida para as URLs que tem o nome do Controller e palavras composta na Action , por exemplo :http://dominiodosite/nomeController/nome-da-action/.
Para solucionar esse problema tive que adicionar novas rotas para as URLs sem o nome do Controller e com palavras composta , e para as URLs que tem o nome do Controller simplesmente decorei as Actions com o atributo ActionName, veja as soluções encontradas abaixo:
- URLs sem o nome do Controller
O primeiro passo foi adicionar novas rota veja como ficou o Global.asax abaixo:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"RouteRegisterLogin",
"register-login",
new { controller = "RegisterLogin", action = "Index" }
);
routes.MapRoute(
"Default","{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
}
A “RouteRegisterLogin” redireciona a solicitação para o Controller “RegisterLogin” e para Action “Index” toda vez que a URL conter “register-login” após o dominio. Por exemplo: http://dominiodosite/register-login.
Note que não configurei a possibilidade de passagem de parâmetros , mais você poderia fazer essa configuração caso seja necessário.
O Controller não sobreu nenhum alteração, veja o código abaixo:
public class RegisterLoginController : Controller
{
public ActionResult Index()
{
return View();
}
}
- URLs com o nome do Controller
Para as URLs com o nome do Controller e palavras compostas no nome da action a solução é mais simples como já mencionei basta utilizar o atributo ActionName nas actions afetadas.Por exemplo para alterar a Url http://dominiodosite/blog/novopost para http://dominiodosite/blog/novo-post basta adicionar o atributo na Action "NovoPost" do Controller "Admin" como o exemplo abaixo:
public class AdminController : Controller
{
[ActionName ("novo-post") ]
public ActionResult NovoPost()
{
return View("~/Views/Admin/novo-post.aspx");
}
}
Encontrei essas soluções para o meu problema em particular, no meu caso não foi definido nada antes do inicio do projeto por isso não deu para definir um padrão para todo o site e as duas soluções acima apresentadas resolveram o meu problema, o ideal seria definir esse tipo de coisa antes de iniciar o projeto assim as solução seria menos traumática ,se você enxergar outra solução para esse problema adicione seu comentário!
Daniel Fonseca Castro