代码之家  ›  专栏  ›  技术社区  ›  ebrown

Asp.net mvc-从自定义操作过滤器访问视图模型

  •  43
  • ebrown  · 技术社区  · 17 年前

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //get model data
        //...
    
        sitemap.SetCurrentNode(model.Name);
    }
    

    5 回复  |  直到 17 年前
        1
  •  55
  •   Steven Lyons    17 年前

    模型位于:

    filterContext.Controller.ViewData.Model
    
        2
  •  19
  •   BartoszKP    10 年前

    我不知道为什么,但是 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);
        }
    }
    

    之后,您需要在中为新模型绑定器设置默认绑定器 Application_Start() Global.asax中的部分:

    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);
        }
    }
    
        3
  •  2
  •   Safin Ahmed    7 年前

    base.OnActionExecuted() 调用方法的最后一行为我解决了“模型为空”的问题。

        4
  •  1
  •   Matas Vaitkevicius user3782709    10 年前

    在。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, 
        }
    
        5
  •  0
  •   Arun Kumar A.J    7 年前

    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);
        }
    }
    

    enter image description here

    推荐文章