2012-02-09 12 views
9

Tengo el siguiente:OnActionExecuting añadir a modelar antes de llegar a la acción

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     var model = filterContext.Controller.ViewData.Model as BaseViewModel; 

     if (model == null) 
     { 
      model = new BaseViewModel(); 
      filterContext.Controller.ViewData.Model = model; 
     } 

     model.User = (UserPrincipal)filterContext.HttpContext.User; 
     model.Scheme = GetScheme(); 
    } 

Ahora paso a paso por lo que puedo ver el usuario y el esquema en el modelo están siendo pobladas.

En el momento en que llego a la acción, sin embargo, ambos son nulos?

¿Qué estoy haciendo mal aquí?

Y, para agregar a esto, ¿es esta la manera correcta de agregar al modelo?

Aquí es el código del controlador:

[InjectStandardReportInputModel] 
public ActionResult Header(BaseViewModel model) 
{ 
    //by this point model.Scheme is null!! 

} 
+0

Podría también publicar su código de 'controlador'? ¿Seguro que ha agregado el 'atributo' a la definición de' clase' o la 'acción'/s aplicable? – xandercoded

+0

código de acción agregado - ¿Está diciendo que esto debería estar funcionando? ... – iwayneo

+0

El mismo problema se trata aquí http://stackoverflow.com/questions/4766156/all-viewmodels-inherit-from-baseviewmodel-can-i-set -this-up-in-onactionexecut –

Respuesta

7

Controller.ViewData.Model no se pueblan parámetros de acción en mvc asp.net. Esa propiedad se usa para pasar datos de la acción a ver.

Si por alguna razón usted no desea utilizar personalizada Modelo aglutinante (que es la forma estándar y Reccommended de poblar parámetros de acción en asp.net-mvc), que podría usted ActionExecutingContext.ActionParameters Property

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.ActionParameters["model"] = new BaseViewModel(); 
     // etc 
    } 
+1

realmente odio admitirlo, pero para otros cometer el mismo error: en realidad comencé a usar este método, y cuando agregué el atributo a otra acción dejó de funcionar. ¿la razón? ¡Hice nombrar a mi modelo "entrada" en esta acción! ahora tengo un cheque y tiro si el atributo se agrega a una acción con un modelo incorrectamente llamado :) – iwayneo

+0

@iwayneo ¿por qué no usaría Binder de modelo personalizado? – archil

2

poco tarde para la respuesta, pero será útil para otros. podemos obtener el valor del modelo en OnActionExecuting simplemente decorando nuestro atributo un poco más.

ESTE ES NUESTRO FILTRO DE CLASE

public sealed class TEST: ActionFilterAttribute 
{ 

    /// <summary> 
    /// Model variable getting passed into action method 
    /// </summary> 
    public string ModelName { get; set; } 

    /// <summary> 
    /// Empty Contructor 
    /// </summary> 
    public TEST() 
    { 
    } 

    /// <summary> 
    /// This is to get the model value by variable name passsed in Action method 
    /// </summary> 
    /// <param name="modelName">Model variable getting passed into action method</param> 
    public TEST(string modelName) 
    { 
     this.ModelName = modelName; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var result = filterContext.ActionParameters.SingleOrDefault(ap => ap.Key.ToLower() == ModelName.ToString()).Value; 
    } 

} 

    THIS IS OUR ACTION METHOD PLEASE NOTE model variable has to be same 
    [HttpPost] 
    [TEST(ModelName = "model")] 
    public ActionResult TESTACTION(TESTMODEL model) 
    { 
    } 

y eso es todo ..... POR FAVOR VOTAR SI como la respuesta

Cuestiones relacionadas