2012-03-04 8 views
8

Tengo un cliente que desea utilizar una convención URL de nombres a lo largo de las líneas de:ASP.Net MVC con rutas complejas: ¿cómo mantenerlo "sano"?

/{subjectarea}/{subject}/{action} 

Lo cual está bien - esto funciona muy bien, con un controlador por área temática, y que tiene la acción después de la Identificación (sujeto) no es un problema en absoluto.

Sin embargo, a continuación se complica, ya que el cliente entonces quiere continuar aún más la jerarquía:

/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction} 

Tengo un controlador para el sujeto fuertemente relacionada (es sólo otra materia), que se encarga de toda la lado administrativo, pero el cliente insiste en que la vista pública cuelgue del sujeto principal en lugar de su propia raíz.

¿Cómo puedo hacer esto mientras evito romper todos los principios de MVC, y también evitando volver a implementar una tonelada de ASP.Net MVC proporcionada funcionalidad en mi controlador de área temática solo para poder manejar los temas relacionados de la misma ¿controlador?

¿Es posible de alguna manera llamar al controlador de temas relacionados desde dentro del controlador principal y devolver la vista resultante (ya que esto mantendría la separación de la funcionalidad de los sujetos con sus propios controladores)? Si eso es posible, resolvería un montón de problemas con esto.

Respuesta

2

Aquí está la solución que resuelve mi problema dado - espero que resuelva a alguien más.

Como mencioné en mi comentario a Robert Harvey, todo lo que realmente necesito es otra ruta que no use los primeros dos o tres componentes como el controlador, la acción y la identificación, sino que tome esos valores más adelante, si colgar esto de un valor estático en la ruta también, es mucho más fácil de hacer.

lo tanto, aquí es la url Me decidí por simplificar la ruta:

/{subjectarea}/{subject}/related/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction} 

La ruta que satisface este URL es el siguiente:

 routes.MapRoute(
      "RelatedSubjects", 
      "{parentcontroller}/{parentsubject}/related/{controller}/{id}/{action}", 
      new { controller = "shoes", action = "view", id = "all" } 
     ); 

En la acción del controlador posterior, que pueda pregunte por los valores de los parámetros para parentcontroller y parentsubject, así puedo filtrar el elemento relacionado para que sea específico al tema padre dado - ¡problema resuelto!

Esta ruta debe estar por encima de las que solo tratan con los dos primeros valores, de lo contrario correrá el riesgo de que otro mapa de ruta secuestre la solicitud.

Podría hacer esto completamente sin la porción/relacionada/estática ya que la ruta podría coincidir fácilmente con el número de valores, y de hecho puedo hacerlo, sin embargo, lo considero mejor para una administración posterior si hay una estática elemento allí para confirmar el uso de la ruta.

Espero que esto ayude a alguien!

+0

Esto es exactamente lo que estaba buscando también, usando un nuevo controlador de vista pero manteniendo el acceso al controlador principal y los parámetros principales. Gracias por publicar sus hallazgos. –

1

Una manera de hacerlo es especificar una ruta comodín (notar el asterisco):

routes.MapRoute("subjects", "{action}/{*path}", 
    new { controller = "Subjects", action = "Index" }); 

Esto permite que el controlador reciba toda la cadena de ruta después de la action.

A continuación, puede obtener la jerarquía de los sujetos en el método controlador de este modo:

string[] subjects = path.Split('/'); 

Una vez que tenga eso, se puede hacer lo que quiera, incluyendo el envío de diferentes sujetos a diferentes métodos de manipulación para su procesamiento.

+0

Esa es la forma que consideré antes de publicar la pregunta; sin embargo, tiene el efecto secundario de descartar la mayor parte de lo que me proporciona ASP.Net MVC en cuanto a que hay una gran cantidad de "enrutamiento" que tendría que hacer después. mano dentro del método de control del manejo de la acción; eso era lo que intentaba evitar. Si pudiera seleccionar el valor, la acción y la identificación del controlador relacionado, entonces puedo dejar todo al controlador objetivo, en lugar de tener que volver a implementar todo en el controlador actual (lo que también violaría el principio de responsabilidad única). ¿Tiene sentido? – Moo

+0

Vale la pena señalar que el problema no es cómo obtener los valores de la ruta, sino cómo obtener la vista resultante del controlador correcto, mientras que dentro de un controlador diferente, si fuera posible hacerlo ... y yo irse en pensamiento cuando algo se me ocurre. Todo lo que realmente necesito es otra estadística donde los tres primeros valores * no * se consideren el controlador, la acción o la identificación, pero solo se toman más datos y los valores de actaul para el controlador, la acción y la identificación de la ruta ... hmmm – Moo

Cuestiones relacionadas