6

estoy usando Acción de filtrado en MVC 3.Cambiar el modelo en el caso OnActionExecuting

Mi pregunta es si puedo hacer a mano el modelo antes de que se pasa a la ActionResult en caso OnActionExecuting?

Necesito cambiar uno de los valores de las propiedades allí.

Gracias,

+0

¿Podría explicar por qué tendría que hacer esto? Sospecho que hay una mejor manera de lograr lo que necesita. – DMulligan

+0

Una de las propiedades del modelo determina cómo se verá la vista: Editor o Pantalla y quiero configurarla de acuerdo con los permisos del usuario –

+0

, ¿por qué quiere que algo como esto dependa de la propiedad del modelo? en su lugar, debe verificar el permiso del usuario dentro de la vista y decidir qué plantilla debe representar (editor o pantalla) –

Respuesta

24

No hay modelo sin embargo, en el caso de OnActionExecuting. El modelo es devuelto por la acción del controlador. Entonces tienes un modelo dentro del evento OnActionExecuted. Ahí es donde puedes cambiar los valores. Por ejemplo, si suponemos que su acción de controlador devuelve un ViewResult y se lo pasó algún modelo que aquí está cómo se puede recuperar este modelo y modificar alguna propiedad:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var result = filterContext.Result as ViewResultBase; 
     if (result == null) 
     { 
      // The controller action didn't return a view result 
      // => no need to continue any further 
      return; 
     } 

     var model = result.Model as MyViewModel; 
     if (model == null) 
     { 
      // there's no model or the model was not of the expected type 
      // => no need to continue any further 
      return; 
     } 

     // modify some property value 
     model.Foo = "bar"; 
    } 
} 

Si desea modificar el valor de una propiedad del modelo de vista eso pasó como argumento de acción, entonces recomendaría hacer esto en una carpeta de modelo personalizado. Pero también es posible lograrlo en el evento OnActionExecuting:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var model = filterContext.ActionParameters["model"] as MyViewModel; 
     if (model == null) 
     { 
      // The action didn't have an argument called "model" or this argument 
      // wasn't of the expected type => no need to continue any further 
      return; 
     } 

     // modify some property value 
     model.Foo = "bar"; 
    } 
} 
+1

¡Gracias, realmente útil! –

+0

Hola, ¿sabes cómo puedo obtener los parámetros pasados ​​de la acción como los ActionDescriptor.ActionParameters en el evento OnActionExecuting? –

+0

Eso es lo que he mostrado en mi respuesta: 'filterContext.ActionParameters [" parameterName "]'. –

Cuestiones relacionadas