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

ASP.NET MVC-从自定义操作筛选器访问视图模型

  •  35
  • ebrown  · 技术社区  · 16 年前

    我正在尝试访问传递到已执行操作筛选器OnAction中的视图的模型数据。有人知道这是否可行吗?

    我正在尝试这样做:

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

    有什么建议吗?

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

    模型位于:

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

    我不知道为什么,但是 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    6 年前

    在.NET核心中,您在上下文中有一个actionArguments IDictionary,其中包含方法中的所有参数。

    所以如果你有下面的控制器方法

        [HttpPost]
        public void Post([FromBody]BaseRequest request)
        {
        }
    

    你可以这样进入这个领域

        public override void OnActionExecuting(ActionExecutingContext context)
        {
          var request = context.ActionArguments["request"] as BaseRequest;`
          //do whatever, 
        }
    
        4
  •  1
  •   Matas Vaitkevicius user3782709    9 年前

    如果你得到空值-作为@gustavo clemente答案的替代方法,你可以尝试重写 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

        5
  •  0
  •   Arun Kumar A.J    6 年前

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

    (这是对@steven lyons答案的评论,但我将作为答案发布,因为我无法评论。)