我正在尝试访问传递给动作过滤器OnActionExecuted中的视图的模型数据。有谁知道这是否可行?
我正在尝试做这样的事情:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//get model data
//...
sitemap.SetCurrentNode(model.Name);
}
有什么建议吗?
答案 0 :(得分:55)
该模型位于:
filterContext.Controller.ViewData.Model
答案 1 :(得分:19)
我不知道为什么,但即使在filterContext.Controller.ViewData.Model
之前执行模型绑定,OnActionExecuted
也始终为空。我找到了一个使用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();
最后,您可以访问Model
中的ActionFilterAttribute
:
public class TraceLog : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//filterContext.Controller.ViewData.Model now isn't null
base.OnActionExecuted(filterContext);
}
}
答案 2 :(得分:2)
在.Net Core中,您在上下文中有一个ActionArguments IDictionary,包含方法中的所有参数
所以如果你有以下控制器方法
[HttpPost]
public void Post([FromBody]BaseRequest request)
{
}
您可以像这样访问字段
public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.ActionArguments["request"] as BaseRequest;`
//do whatever,
}
答案 3 :(得分:1)
如果您获得null - 作为@Gustavo Clemente的答案的替代方案,您可以尝试覆盖OnActionExecuted
并以下列方式将viewModel传递到视图中:
<强>动作:强>
[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);
}
}
答案 4 :(得分:1)
调用@NgModule
的方法的最后一行为我解决了“模型为空”的问题。
(这是对@Steven Lyons答案的评论,但由于无法发表评论,因此我将其发布为答案。)