¿Cómo defino una ruta general para un sitio MVC de ASP.NET?
-
03-07-2019 - |
Pregunta
Tengo un sitio de noticias con artículos etiquetados en categorías.
Mi controlador se llama " Categoría " y esta URL:
http://mysite.com/Category/Sport
pasa Sport
a la acción Index
en el controlador Categoría
.
Quiero permitir las siguientes URL:
http://mysite.com/Sport/Hockey
http://mysite.com/Sport/Football
http://mysite.com/Science/Evolution
Que pasa toda la información de la categoría a la acción Índice
en el controlador Categoría
.
¿Cómo creo una ruta para todos que maneje todo esto y los lleve a la categoría?
Solución
Hay una buena respuesta a mi pregunta en esta línea aquí .
Otros consejos
Puedes hacerlo así:
routes.MapRoute("Default", "{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" }
);
y luego en tu controlador:
public class CategoryController : Controller
{
public ActionResult Display(string category, string subcategory)
{
// do something here.
}
}
No utilice la ruta anterior para TODAS las rutas (no puede tener una página Acerca de, etc., a menos que especifique rutas explícitas antes de la anterior).
Sin embargo, podría incluir una restricción personalizada para limitar la ruta solo a las categorías 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;
}
}
Que usas en tu ruta como esta:
routes.MapRoute("Default",
"{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" },
new { categoryExists = new OnlyExistingCategoriesConstraint() }
);
De esa manera, no interferirá con tus otras rutas definidas.