2012-03-13 29 views
13

¿Es posible crear una clase parcial para el controlador en MVC?Clase parcial para el controlador

Motivo: Tengo un controlador que contiene demasiados códigos. Este controlador contiene el código para diferentes informes y debido a demasiados códigos, reduce la legibilidad del código. Quiero mantener el nombre del controlador igual para todos los informes, así que quiero distribuir el código para los diferentes informes.

Si puedo hacer otra cosa que no me digas.

Gracias Alok Shah

Respuesta

13

Sí, puedes usar una clase parcial - el compilador justo a todos ellos se une un tiempo de compilación para producir una.

Sin embargo, usted menciona que desea 'distribuir' el código; si el código va a ir a varios proyectos, los parciales no lo ayudarán.

su lugar, puede crear clases de controlador de base (que heredan de System.Web.Mvc.Controller en un proyecto de biblioteca de clases, con los métodos de acción necesarios, y luego usar simplemente de enrutamiento para enrutar URLs similares a diferentes controladores. Here's a link to the Asp.Net Tutorial 'Creating Custom Routes' que podría ser útil para eso. Recomiendo encarecidamente consultar el resto del tutorial si hay otros aspectos centrales de MVC de los que no está seguro. No cubre todo, pero sí lo básico.

Una aplicación web que debe usarse aquellos entonces simplemente tienen sus propios controladores que heredan de aquellos redistribuibles. Incluso mejor, ahora puedes crear puntos de extensibilidad a través de métodos virtuales, etc. si hay elementos de estos informes que las diferentes aplicaciones web pueden necesitar para personalizar.

Así "Reports/Customers" podía ruta a una CustomerReportsController y "Reports/Orders" podía ruta a una OrdersReportsController:

routes.MapRoute("CustReports", 
    "Reports/Customers/{action}", 
    new { controller = "CustomerReports", action = "Index", id = "" }); 

routes.MapRoute("OrderReports", 
    "Reports/Orders/{action}", 
    new { controller = "OrdersReports", action = "Index", id = "" }); 

Este es el enfoque más simplista a este problema - pero creo que el uso de Areas (enlace es a MSDN paso a paso) haría más probablemente también sea aplicable, en cuyo caso es posible que no necesite usar enrutamiento en absoluto porque la ruta predeterminada probablemente lo haría todo.

+0

+1, buena idea !! –

+0

@Andras: ¿Puedo tener un código de muestra o un enlace de referencia para ello? Nunca hice un enrutamiento personalizado, así que no tengo ninguna idea al respecto. –

+0

@alok_dida han actualizado. –

6

¡Por supuesto!

Las clases parciales son una característica del lenguaje C# y no guardan ninguna relación con MVC o cualquier otro marco que pueda estar utilizando.

+0

.. Eso significa que puedo crear clases parciales también para el controlador. ¿Derecha? –

+2

Esto es correcto :) –

0

Sí. Las clases parciales son realmente solo una característica del lenguaje, y la clase compilada es una clase .NET regular como cualquier otra.

Yo sugeriría sin embargo, que se divide el controlador en varios controladores, para asegurar la separación adecuada de las preocupaciones (que tiene una clase que es tan grande que necesita para dividirlo en varios archivos seguramente smell bad.)

0

" Si puedo hacer cualquier otra manera que hágamelo saber"

¿qué tal:

  • abstraer el 'hacer' piezas a varios generadores de informes para los tipos de informes discretos, todos los cuales se ajustan a una interfaz . Estos generadores de informes serán clases que se encuentran fuera del nivel MVC de la aplicación.
  • Limpiar el controlador para que las dependencias (generadores de informes) se inyecten en el constructor, utilizando Ninject, StructureMap o Castle Windsor
  • Limpiar todo el código de generación de informes fuera del controlador y en implementaciones concretas del informe abstracciones del generador

No necesitará dividir los controladores en clases separadas. La desventaja es que tomará un tiempo razonable para conceptualizar e implementar, pero terminará con una mejor base de código.

+0

No puedo contactarte. ¿Me puede dar algún código de muestra o solicitud de muestra? –

+0

La dificultad aquí es en conceptualizar: realmente no puedo darle una aplicación de muestra, pero puedo indicarle una explicación decente y un ejemplo de mucho de lo que describí (también en un lenguaje mejor) - http://www.mikesdotnetting.com/Article/117/Dependency-Injection-and-Inversion-of-Control-with-ASP.NET-MVC – SpaceBison

Cuestiones relacionadas