Вопрос по asp.net-mvc-3, asp.net-mvc – Изменить модель в событии OnActionExecuting

7

Я использую Action Filter в MVC 3.

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

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

Спасибо,

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

Ваш Ответ

1   ответ
25

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";
    }
}
Error: User Rate Limit Exceeded Yair Nevet
Error: User Rate Limit ExceededfilterContext.ActionParameters["parameterName"].
Error: User Rate Limit Exceeded Yair Nevet
Error: User Rate Limit ExceededOnActionExecutedError: User Rate Limit ExceededfilterContext.ActionDescriptorError: User Rate Limit ExceededOnActionExecutingError: User Rate Limit ExceededOnActionExecutedError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Yair Nevet

Похожие вопросы