Search code examples
c#asp.net-mvc-3modelbindersaction-filter

OnActionExecuting add to model before getting to action


I have the following:

 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();
    }

Now stepping through that i can see the user and scheme on the model are being populated.

By the time I get to the action however they are both null?

What am i doing wrong here?

And adding to this, is this the proper way of adding to the model?

Here is the controller code:

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

}

Solution

  • Controller.ViewData.Model is not populating action parameters in asp.net mvc. That property is used to pass data from action to view.

    If for some reason you do not want to use custom Model Binder (which is the standard, reccommended way of populating action parameters in asp.net-mvc), you could you ActionExecutingContext.ActionParameters Property

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