Asp.net MVC - 从一个自定义的行为过滤访问视图模型
-
22-08-2019 - |
题
我试图访问传递给在OnActionExecuted动作过滤器视图中的模型数据。有谁知道这是可能的吗?
我试图做这样的事情:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//get model data
//...
sitemap.SetCurrentNode(model.Name);
}
任何意见?
解决方案
该模型是在:
filterContext.Controller.ViewData.Model
其他提示
我不知道为什么,但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);
}
}
在净核心你有一个ActionArguments IDictionary的上下文,与从方法中的所有参数
因此,如果你有以下的控制器方法
[HttpPost]
public void Post([FromBody]BaseRequest request)
{
}
可以访问诸如等等领域
public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.ActionArguments["request"] as BaseRequest;`
//do whatever,
}
使base.OnActionExecuted()
调用该方法的最后一行解决了“模型被空”的问题,我
(这是@Steven里昂的答案评论,但我张贴作为一个答案,因为我不能发表评论。)
如果你正在空 - 作为替代@Gustavo克莱门特的回答,您可以尝试重写OnActionExecuted
和传递您的视图模型到视图方式如下:
<强>动作:强>
[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);
}
}
不隶属于 StackOverflow