2010-01-12 11 views
5

Tengo un filtro de acción que estoy ejecutando OnActionExecuting en ASP.NET MVC 2. Esencialmente me gustaría que el filtro de acción desinfecte mis datos y reemplace el modelo actual (que se pasará a los filtros de acción posteriores y también mi método de acción) con el modelo sanitizado. ¿Es esto posible y es una mala idea? Si es así, ¿por qué?Modificar un modelo en un ActionFilter

gracias de antemano, JP

+0

huele mal diseño. –

+7

Filip, si vas a criticar, sé constructivo. Dime por qué es un mal diseño, dime qué ves como buenas alternativas ... de lo contrario tu comentario es inútil para mí y para cualquier otra persona que lea esta publicación ... –

Respuesta

5

Si tiene que hacer frente a sus modelos, es muy probable que va a estar tratando más en el ámbito de un solo controlador (a menos que todos los controladores utilizan los mismos tipos de modelos ?). Un enfoque alternativo sería anular los métodos OnActionExecuting() y OnActionExecuted() de los mismos Controladores. Esto le permite mantener su lógica comercial dentro del alcance del controlador.

En general, los ActionFilters se utilizan para problemas transversales, algo que desea ejecutar para muchos métodos de acción, independientemente de dónde existan en la aplicación. Por lo tanto, a menos que la lógica de desinfección de su modelo se aplique a muchos controladores y acciones, o sea muy genérica (lo que tal vez sea, en cuyo caso su enfoque probablemente sea bueno), puede sacarlo de los filtros y ponerlo en sus controladores. Si es algo que se puede aplicar ampliamente, entonces un ActionFilter está bien.

+0

Definitivamente veo tu punto, pero la desinfección es en gran medida un CCC y se usará en controladores y métodos de acción. –

6

Aquí es para MVC v1, espero que esto no se cambia en la versión 2:

var view = filterContext.Result as ViewResultBase; 
if (view != null) 
    view.ViewData.Model ... 

no veo por qué quiere hacerlo en OnActionExecuting, pero si necesidad, lo hacen allí, y establecer un indicador (campo privado) que OnActionExecuted tiene que modificar el Modelo resultante. Pero tendrá que usar el último de todos modos, excepto si asigna el resultado. En este caso, su acción no se ejecutará en absoluto y se usará el resultado asignado.

+0

Estoy intentando acceder al modelo OnActionExecuting (es decir, antes de que se ejecute la acción), por lo que en este caso el Modelo siempre devolverá nulo ... –

+0

Debería haber sido más explícito, la razón por la que quiero (debo) hacerlo OnActionExecuting es así que aún puedo disparar el filtro ValidateInput (¡y no tengo que apagarlo!). Si mis propiedades contienen HTML en ese momento, se marcarán como peligrosas y el filtro fallará (a falta de un término mejor). Los datos deben actualizarse antes de pulsar este segundo filtro, por lo tanto OnActionExecuted es demasiado tarde ... –

2

Por cierto, para MVC 3 & 4:

filterContext.Controller.ViewData.Model 
Cuestiones relacionadas