Como faço para definir um catch-all rota para um site ASP.NET MVC?
-
03-07-2019 - |
Pergunta
Eu tenho um site de notícias com artigos marcado em categorias.
O meu controlador é chamado de "Categoria" e este URL:
http://mysite.com/Category/Sport
passa Sport
à ação Index
em Category
controlador.
eu quero permitir que os seguintes URLs:
http://mysite.com/Sport/Hockey
http://mysite.com/Sport/Football
http://mysite.com/Science/Evolution
que passa todas as informações da categoria para a ação Index
em Category
controlador.
Como faço para criar um catch-all rota que lida com todas estas e ônibus-los para categoria?
Solução
Há uma boa resposta muito à minha pergunta ao longo destas linhas aqui .
Outras dicas
Você pode fazê-lo como este:
routes.MapRoute("Default", "{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" }
);
e, em seguida, em seu controlador:
public class CategoryController : Controller
{
public ActionResult Display(string category, string subcategory)
{
// do something here.
}
}
Do not que qualquer rota acima será usado para rotas TODAS (você pode não ter uma página Sobre etc menos que você especifique rotas explícitas antes de a citada acima).
Você pode, porém, incluir uma restrição personalizada para limitar a rota para categorias só existentes. Algo como:
public class OnlyExistingCategoriesConstraint : IRouteConstraint
{
public bool Match
(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
{
var category = route.DataTokens["category"];
//TODO: Look it up in your database etc
// fake that the category exists
return true;
}
}
O que você usa em sua rota como esta:
routes.MapRoute("Default",
"{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" },
new { categoryExists = new OnlyExistingCategoriesConstraint() }
);
Em dessa forma ele não irá interferir com suas outras rotas definidas.