Я использую фильтр действий в MVC 3.
Мой вопрос: могу ли я создать модель до того, как она будет передана в событие ActionResult в OnActionExecuting?
Мне нужно изменить одно из значений свойств.
Спасибо,
Я использую фильтр действий в MVC 3.
Мой вопрос: могу ли я создать модель до того, как она будет передана в событие ActionResult в OnActionExecuting?
Мне нужно изменить одно из значений свойств.
Спасибо,
В событии 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";
}
}
filterContext.ActionParameters["parameterName"]
.
- person Darin Dimitrov; 03.05.2012
OnActionExecuting
. Метод OnActionExecuted
вызывается после того, как действие завершило выполнение, поэтому нет смысла изменять его входные параметры.
- person Darin Dimitrov; 03.05.2012
OnActionExecuted
. Это потому, что при выполнении этого метода больше нет никаких действий. Действие завершено. Из свойства filterContext.ActionDescriptor
вы можете получить список и тип каждого аргумента, но не значение. Одна из возможностей — сохранить значения, к которым вам нужно получить доступ, в HttpContext внутри метода OnActionExecuting
, а затем получить их в методе OnActionExecuted
из HttpContext.
- person Darin Dimitrov; 03.05.2012