Enrutamiento ASP.NET MVC para un sitio de controlador único
-
05-07-2019 - |
Pregunta
Estoy intentando crear un sitio simple.Básicamente tiene un controlador. Home
controlador.
Este controlador tiene una acción. Index
toma una string
como argumento (que es un directorio) y usa ese 'directorio' para hacer su trabajo.
No puedo encontrar la manera de crear una ruta genérica que envíe todas las URL a esta acción.
Podría existir cualquier combinación de URL y cualquier cosa más allá del nombre de dominio debería ser la cadena.
http://<domain>/2008
http://<domain>/2008/09
http://<domain>/2008/09/Fred
¿Alguien sabe como hacer esto?También estaría bien si todos los valores se pasaran como una lista.
¿Existe una mejor manera de hacer esto?
Solución
Prueba esto:
routes.MapRoute(
"Default", "{*path}",
new { controller = "Home", action = "Index" }
);
Y el controlador:
public class HomeController : Controller {
public ActionResult Index(string path) {
return View();
}
}
Otros consejos
Mi primer pensamiento es que es una "mala idea".si puedes tomar cualquier cosa te pueden pedir una URL, tendrás que tener una gran lista negra (o lista blanca).Hay tantas vacantes.Una mejor manera sería explicar explícitamente esas rutas y cómo permitir los parámetros, y luego realizar acciones que se ocupen de esas rutas aceptadas.Entonces tendría una ruta genérica de captura total que redirigiría a una página de error.
Se siente como si estuvieras intentando mezclar manzanas y naranjas.ASP.NET MVC elimina intencionadamente la idea de "página".Realmente no hay razón para tener directorios para varios usuarios a menos que esté realizando algún tipo de E/S de archivos, y si ese es el caso, entonces se puede abstraer para que funcione en el paradigma ASP.NET MVC mucho más fácilmente de lo que piensa.
En ASP.NET MVC, si desea variar la información que busca según la cadena pasada (muy parecida a la cadena que pasó), aquí tiene una forma "segura" de hacerlo:
Método #1: Tres rutas, tres acciones, diferentes nombres
routes.MapRoute(
"YearOnly",
"{year}",
new { controller = "Index", action = "ShowByYear" },
new { year = @"\d{4}" }
);
routes.MapRoute(
"YearAndMonth",
"{year}/{month}",
new { controller = "Index", action = "ShowByYearAndMonth" },
new { year = @"\d{4}", month = @"\d{2}" }
);
routes.MapRoute(
"YearMonthAndName",
"{year}/{month}/{name}",
new { controller = "Index", action = "ShowByYearMonthAndName" },
new { year = @"\d{4}", month = @"\d{2}" }
);
Y luego usarías los valores de ruta pasados en tus Acciones del Controlador para determinar cómo ven los datos:
ShowByYear(string year)
{
//Return appropriate View here
}
ShowByYearAndMonth(string year, string month)
{
//Return appropriate View here
}
ShowByYearMonthAndName(string year, string month, string name)
{
//Return appropriate View here
}
Método n.º 2: método sugerido
routes.MapRoute(
"YearOnly",
"{year}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}" }
);
routes.MapRoute(
"YearAndMonth",
"{year}/{month}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}", month = @"\d{2}" }
);
routes.MapRoute(
"YearMonthAndName",
"{year}/{month}/{name}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}", month = @"\d{2}", name = "" }
);
Show(string year)
{
//
}
Show(string year, string month)
{
//Return appropriate View here
}
Show(string year, string month, string name)
{
//Return appropriate View here
}
La belleza de este enfoque es que el MapRoute
maneja el análisis de URL;y mantiene alejada a la gentuza.Luego puede configurar una ruta general que simplemente arroje un error.Preferiría realizar algunos análisis en el lado de la ruta con regex
que en su controlador (en mi opinión).
Esto lo mantiene reducido a tres acciones sobrecargadas y permite un código más limpio y más parecido a 'MVC'.