我正在尝试在OnActionExecuted操作筛选器中访问传递给视图的模型数据。有人知道是否可能吗?
我想实现类似于以下操作:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//get model data
//...
sitemap.SetCurrentNode(model.Name);
}
有什么建议吗?
我正在尝试在OnActionExecuted操作筛选器中访问传递给视图的模型数据。有人知道是否可能吗?
我想实现类似于以下操作:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//get model data
//...
sitemap.SetCurrentNode(model.Name);
}
有什么建议吗?
该模型位于:
filterContext.Controller.ViewData.Model
我不知道为什么,但是即使在OnActionExecuted
之前执行了模型绑定,filterContext.Controller.ViewData.Model
始终为空。我发现了一种解决方法,使用OnModelUpdated
事件在之前设置该属性。
我有一个模型绑定器:
public class CustomModelBinder: DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
controllerContext.Controller.ViewData.Model = bindingContext.Model;
base.OnModelUpdated(controllerContext, bindingContext);
}
}
接下来,您需要在Global.asax的Application_Start()
部分中将默认绑定程序设置为您的新模型绑定程序:
ModelBinders.Binders.DefaultBinder = new CustomModelBinder();
最后,你可以在一个 ActionFilterAttribute
中访问你的 Model
:
public class TraceLog : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//filterContext.Controller.ViewData.Model now isn't null
base.OnActionExecuted(filterContext);
}
}
base.OnActionExecuted()
解决了“模型为空”的问题。(这是对@Steven Lyons答案的评论,但我发表为答案,因为我无法评论。) [HttpPost]
public void Post([FromBody]BaseRequest request)
{
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.ActionArguments["request"] as BaseRequest;`
//do whatever,
}
[Breadcrumb("Index")]
public ActionResult UnitIndex()
{
View(new Answers());
}
属性:
public class BreadcrumbAttribute : ActionFilterAttribute
{
public string Page { get; set; }
public BreadcrumbAttribute(string page)
{
Page = page;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var model = (IBreadcrumbs)filterContext.Controller.ViewData.Model;
model.Breadcrumbs = BreadcrumbHelper.GetBreadCrumbs(string.Format("{0}", filterContext.RouteData.DataTokens["area"]), Page);
}
}
ViewData.Model
is not available inOnActionExecution
method of ActionFilter, see this answer if you want to get the model inOnActionExecution
- Hooman Bahreini