Manejo de URL complejas en ASP MVC
-
06-07-2019 - |
Pregunta
Tengo, creo, una URL compleja para tratar en ASP MVC 1.0: Todas mis acciones en la mayoría de los controladores requieren dos parámetros todo el tiempo: Cuenta y Proyecto. Esto se suma a los requisitos de cada acción. Esto significa que una URL típica es así:
http://abcd.com/myaccount/projects/project_id/sites/edit/12
En este ejemplo: myaccount es el nombre de la cuenta. Los proyectos pueden ser un controlador, otras opciones son como ubicaciones , empleados . project_id es la identificación de un proyecto dentro de myaccount , sitios podría ser un controlador, otras opciones son como staff o pagos . editar es una acción y 12 es la identificación del sitio editado. (espero que esto sea lo suficientemente claro)
Ahora una opción es crear una ruta y pasar project_id y cuenta en todas las acciones de los controladores agregando dos parámetros adicionales a todas las acciones. Esto no es realmente deseado y tampoco estoy seguro de que los dos controladores (proyectos y sitios) funcionen aquí.
Mi situación ideal es usar algún tipo de contexto que viaje con la llamada a la acción del controlador y almacenar project_id y myaccount allí. El resto de los parámetros pueden tratarse de manera normal como:
// sitescontroller
public ActionResult Edit(string id)
{
string account = somecontext["account"];
string project_id = somecontext["project"];
// do stuff
}
¿Alguna idea de cómo / dónde puede suceder esto? Además, ¿cómo funcionará esto con ActionLink (es decir, generar enlaces correctos basados ??en este contexto)?
¡Gracias!
Solución
Primero debe agregar los tokens a sus rutas como {empresa} / projects / {project} {controller} / {action} / {id}
. Luego, si escribió su propia IControllerFactory, entonces sería muy fácil insertar los valores de RouteData en el controlador a través del constructor o de la forma en que quisiera hacerlo. Probablemente la forma más fácil de comenzar sería subclasificar DefaultControllerFactory y anular el método CreateController.
Otros consejos
Esto no tiene mucho sentido para mí. ¿Por qué tendría una ruta similar a la siguiente?
{controller}/{id}/{controller}/{id}
?