Me gustaría lograr algo muy similar a this question, con algunas mejoras.Cómo enrutar URL estructuradas por árbol con enrutamiento ASP.NET?
Hay una aplicación web ASP.NET MVC.
Tengo un árbol de entidades.
Por ejemplo, una clase Page
que tiene una propiedad llamada Children, que es del tipo IList<Page>
. (Una instancia de la clase Page
corresponde a una fila en una base de datos.)
Tenga en cuenta que los propietarios del sitio pueden agregar una página nueva en cualquier momento o eliminar las existentes, y las URL también deben reflejar esos cambios.
Me gustaría asignar una URL única a cada Page
en la base de datos.
Manejo de objetos Page
con un controlador llamado PageController
.
URL de ejemplo:
http://mysite.com/Page1/
http://mysite.com/Page1/SubPage/
http://mysite.com/Page/ChildPage/GrandChildPage/
Usted consigue el cuadro.
Entonces, me gustaría que cada objeto Page
tenga su propia URL que sea igual a la URL de su padre más su propio nombre.
Además de eso, también me gustaría la capacidad de asignar un solo Page
a la dirección URL /
(raíz).
quisiera aplicar estas reglas:
- Si una URL puede ser manejado con cualquier otra vía, o existe un archivo en el sistema de archivos en la URL especificada, dejar que el mapeo URL predeterminada ocurra
- Si una URL puede ser manejado por el proveedor de ruta de acceso virtual, deje que lo manejan
- Si no hay otro, mapear las otras direcciones URL a la clase
PageController
También encontré this question, y also this one y this one, pero no fueron de mucha ayuda, ya que no brindan una explicación sobre mis dos primeros puntos.
veo las siguientes soutions posibles:
- trazar una ruta para cada página invidually.
Esto requiere que revise todo el árbol cuando se inicia la aplicación y agrega una ruta de coincidencia exacta al final de la tabla de rutas. - Podría agregar una ruta con
{*path}
y escribir unaIRouteHandler
personalizada que lo maneje, pero no veo cómo podría lidiar con las dos primeras reglas, dado que este manejador manejaría todo.
Hasta ahora, la primera solución parece ser la correcta, porque también es la más simple. Pero aún así, incluso en ese caso, no estoy seguro de cómo puedo hacer el PageController
para manejar las solicitudes.
Realmente apreciaría sus pensamientos sobre esto.
¡Gracias de antemano!
EDIT: Ahora tuve tiempo de examinar cada aspecto de cada respuesta que recibí. Acepté la respuesta de Neal, ya que él es quien brinda la mejor explicación sobre cómo funcionan las cosas. También volví a votar todas las otras respuestas, ya que proporcionan buenas ideas.
¿Por qué y cómo debería agregar rutas para los archivos existentes? Además, ¿cómo construiría la ruta para el árbol y los dirigiría al Controlador apropiado? – Venemo
No es necesario; de forma predeterminada, el sistema de enrutamiento buscará un archivo existente y favorecerá que se entregue eso en vez de tratar de encontrar un controlador y una acción que coincidan. – Paul
@Paul - Gracias. ¿Esto se aplica a los archivos proporcionados por un proveedor de ruta virtual también? – Venemo