¿Qué cosas puedo poner dentro de un BaseController para simplificar mi vida MVC?

Mi controlador base tiene:

[Authorize(Roles = "sys_admin")]

Quiero tener una acción en un controlador que sea diferente y esté disponible para "usuario" y "sys_admin". ¿Puedo anular y cómo lo hago?

También cualquier sugerencia sobre qué más podría poner en un controlador base que podría simplificar mi codificación. Por ejemplo, ¿qué hay en sus controladores base?

preguntado el 08 de noviembre de 11 a las 13:11

5 Respuestas

Todo lo que use en cada controlador: atributos, métodos, propiedades, etc. Lo mismo que pondría en cualquier clase base.

respondido 08 nov., 11:17

+1. La regla general como siempre: todo lo que se encuentre duplicando debe trasladarse a la clase base. - jgauffin

Solo para agregar a la discusión, tengo algunos métodos de utilidad adicionales en mi controlador compartido. Escribo un montón de pequeñas aplicaciones para uso corporativo, así que trato de repetir el código lo menos posible aquí.

  • getContext (): reúne un objeto que contiene información del usuario como IP, nombre de host, id, etc. para fines de registro.
  • Vistas compartidas / parciales como error, predeterminado y redireccionamiento (utilizado para redirigir solicitudes ajax).
  • RedirectToError (): Creé esto para usar de manera similar a RedirectToAction. Carga un ErrorObject con información, lo lanzo a la sesión y devuelvo un Redirect a mi página de Error.
  • Métodos generales de registro y rastreo para poder escupir información rápidamente en un archivo.
  • Anulo OnActionExecuting y compruebo si mi sesión sigue siendo válida y, si no, lo redirecciono para iniciar sesión. Probablemente mejor con los atributos ... fue rápido y sucio. También rastree Url.PathAndQuery para depurar aquí.
  • Cualquier acción de acceso a datos que usaría en las vistas con ajax, como cargar una lista de departamentos.
  • OnException también se anula.

Eso es lo que tengo en el mío hasta ahora.

respondido 08 nov., 11:18

En mis controladores base, de hecho, puse algún método de utilidad ([NonAction]) recopilados a lo largo del tiempo. Prefiero agregar funcionalidades a los controladores decorando con atributos si es posible.

Últimamente mi controlador base tiene:

  • algunas Propiedades para recuperar información sobre el usuario actual (información específica de mi aplicación, no el material User.Identity)
  • Un simple protected override void OnException(ExceptionContext filterContext); anular para al menos registrar excepciones no controladas y tener algún tipo de notificaciones automáticas
  • Un montón de métodos relacionados con las cookies (administración de cookies de autenticación de WebForms, por ejemplo)
  • Un montón de atributos estándar útiles (generalmente [Authorize], [HandleError], [OutputCache]) en su declaración.
  • algún método estándar para preparar tipos de datos json ampliamente utilizados sobre la marcha (cuando sea posible, prefiero tener un objeto json estándar con ErrorCode, ErrorMessage y UserData).

Con el tiempo encontrarás más y más utilidades para mantener con tus controladores, intenta mantener un ensamblaje con los más simples (evitando dependencias pesadas), te vendrá bien con tus próximos proyectos MVC. (lo mismo ocurre con los ayudantes y, hasta cierto punto, también con las plantillas del editor).

Para la parte Autorizar atributo, bueno, creo que la forma más limpia es escribir tu propio AuthorizeAttribute clase, específicamente una NonAuthorizeAttribute. Creo que también lo he visto en algún lugar de SO.

También puedes jugar con el Order Propiedad del defecto AuthorizeAttribute - Ponga un orden diferente en BaseController y en Acción, para que Action se ejecute primero, pero no puedo recordar si realmente puede romper la cadena de procesamiento de Atributos.

Saludos,

M.

respondido 08 nov., 11:18

no usar OnException en los controladores. Utilice filtros para iniciar sesión. Derive HandleErrorAttribute y agregue su registro en él. El cambio a su implementación en global.asax - jgauffin

@jgauffin: Sí, tiene 100% de razón, los atributos y filtros son mucho mejores que los métodos de anulación, pero a veces la anulación rápida y sucia es simplemente hacer el trabajo. - BigMike

.. y deja un desastre para que otra persona lo limpie;) - jgauffin

El mantenimiento es lo más importante. MVC ayuda mucho, aún cuando pienso en el futuro, me da escalofríos. Este sería un buen punto de partida para una discusión profunda sobre las mejores prácticas con MVC, un poco fuera de tema en SO, pero muy valioso para todos nosotros. De hecho, estoy trabajando en un gran proyecto y siento que se nos está yendo de las manos, pero no hay tiempo para parar y pensar en reorganizarlo bien. - BigMike

Lee mi blog. Obtuve varias entradas sobre MVC y el mantenimiento del código en general (enlace en mi perfil) - jgauffin

No podemos decirte lo que necesitas en tu controlador base, tienes que revelar este tipo de cosas a medida que implementas tus controladores y ves el código repetido. No dudes en refactorizar estas cosas en tu BaseController, y ten en cuenta que tal vez deberías tener 2 o más BaseControllers, o una jerarquía de 2 capas de BaseControllers.

Te doy dos consejos, los que siempre tengo en mi BaseController:

  1. método de ayuda súper útil para el enlace de modelos basado en interfaz:
protegido T Bind () donde T: U, nuevo () donde U: clase {modelo T = nuevo T (); TryUpdateModel (modelo); modelo de retorno; }

Luego, puede tener múltiples "conjuntos" de propiedades que desea vincular en diferentes escenarios implementados como interfaces, y un modelo simple vincula su objeto (incluso el objeto existente, de DB) con valores entrantes.

2. Si usa AcionResults personalizados (tal vez sus constructores Json específicos, etc.), cree sus métodos de "atajos" en BaseController. Lo mismo que el método View () es un atajo para devolver un nuevo ViewResult (...)

respondido 08 nov., 11:19

the Bind () es genial. ¡Simple, conciso y útil! +1 - BigMike

@rouen Supongo que no entiendo para qué se usa Bind. ¿Tiene un ejemplo práctico de por qué necesitaría esto? - IrónicoMuffin

Para agregar más a las buenas respuestas que ya están aquí: almacenamiento en caché almacenamiento en caché almacenamiento en caché

Consulte nuestra página Deshabilitar la caché del navegador para todo el sitio web ASP.NET

contestado el 23 de mayo de 17 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.