Изменить модель в событии OnActionExecuting

Я использую фильтр действий в MVC 3.

Мой вопрос: могу ли я создать модель до того, как она будет передана в событие ActionResult в OnActionExecuting?

Мне нужно изменить одно из значений свойств.

Спасибо,


person Yair Nevet    schedule 02.05.2012    source источник
comment
Не могли бы вы объяснить, зачем вам это нужно? Я подозреваю, что есть лучший способ выполнить то, что вам нужно.   -  person DMulligan    schedule 02.05.2012
comment
Одно из свойств модели определяет, как будет выглядеть представление: редактор или отображение, и я хочу установить его в соответствии с разрешениями пользователя.   -  person Yair Nevet    schedule 03.05.2012
comment
почему вы хотите, чтобы что-то подобное зависело от свойства модели. вместо этого вы должны проверить разрешение пользователя внутри представления и решить, какой шаблон отображать (редактор или отображение)   -  person Parv Sharma    schedule 03.05.2012


Ответы (1)


В событии OnActionExecuting еще нет модели. Модель возвращается действием контроллера. Итак, у вас есть модель внутри события OnActionExecuted. Здесь вы можете изменить значения. Например, если мы предположим, что действие вашего контроллера вернуло ViewResult и передало ему некоторую модель, вот как вы можете получить эту модель и изменить какое-либо свойство:

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";
    }
}

Если вы хотите изменить значение некоторого свойства модели представления, которое передается в качестве аргумента действия, я бы рекомендовал сделать это в пользовательском связывателе модели. Но также возможно добиться этого в событии 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";
    }
}
person Darin Dimitrov    schedule 03.05.2012
comment
Привет, может быть, вы знаете, как я могу получить переданные параметры действия, такие как ActionDescriptor.ActionParameters в событии OnActionExecuting? - person Yair Nevet; 03.05.2012
comment
Вот что я показал в своем ответе: filterContext.ActionParameters["parameterName"]. - person Darin Dimitrov; 03.05.2012
comment
В своем предыдущем комментарии вы сказали, что находитесь в методе OnActionExecuting. Метод OnActionExecuted вызывается после того, как действие завершило выполнение, поэтому нет смысла изменять его входные параметры. - person Darin Dimitrov; 03.05.2012
comment
Я думаю, что я недостаточно ясен, поэтому позвольте мне быть более ясным: первым делом нужно было изменить модель, как вы мне показываете. Вторая проблема - прочитать параметры действия, и это то, что я хочу сделать сейчас... - person Yair Nevet; 03.05.2012
comment
У вас нет доступа к параметрам действия в методе OnActionExecuted. Это потому, что при выполнении этого метода больше нет никаких действий. Действие завершено. Из свойства filterContext.ActionDescriptor вы можете получить список и тип каждого аргумента, но не значение. Одна из возможностей — сохранить значения, к которым вам нужно получить доступ, в HttpContext внутри метода OnActionExecuting, а затем получить их в методе OnActionExecuted из HttpContext. - person Darin Dimitrov; 03.05.2012
comment
Может ли результат filtercontext быть приведен к динамической модели? Мне нужно получить доступ к одному свойству модели в методе OnActionExecuted. Для каждой модели это имя/тип свойства будет одинаковым, но модели будут разными для каждого действия. - person veena; 05.05.2020