OnActionExecuting добавить в модель, прежде чем приступить к действию - PullRequest
9 голосов
/ 09 февраля 2012

У меня есть следующее:

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

Теперь, пройдя через это, я вижу, что пользователь и схема на модели заполняются.

К тому времени, когда я доберусь до действия, однако они оба будут нулевыми?

Что я здесь не так делаю?

И добавление к этому, это правильный способ добавления к модели?

Вот код контроллера:

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

}

Ответы [ 2 ]

7 голосов
/ 09 февраля 2012

Controller.ViewData.Model не заполняет параметры действия в asp.net mvc. Это свойство используется для передачи данных из действия для просмотра.

Если по какой-то причине вы не хотите использовать пользовательский связыватель моделей (который является стандартным рекомендуемым способом заполнения параметров действия в asp.net-mvc), вы можете ActionExecutingContext.ActionParameters Свойство

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.ActionParameters["model"] = new BaseViewModel();
        // etc
    }
1 голос
/ 29 августа 2013

Немного поздно для ответа, но это будет полезно для других. мы можем получить значение модели в OnActionExecuting, просто добавив наш атрибут немного больше.

ЭТО НАШ КЛАСС ФИЛЬТРА

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)
    {
    }

И ЭТО ЭТО ..... ПОЖАЛУЙСТА, ГОЛОСОВАТЬ, ЕСЛИ ВАМ НРАВИТСЯ ОТВЕТ

...