43

我正在尝试访问传递给操作过滤器 OnActionExecuted 中的视图的模型数据。有谁知道这是否可能?

我正在尝试做这样的事情:

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    //get model data
    //...

    sitemap.SetCurrentNode(model.Name);
}

有什么建议吗?

4

5 回答 5

59

该模型位于:

filterContext.Controller.ViewData.Model
于 2009-05-16T16:56:01.420 回答
20

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

最后你可以访问你ModelActionFilterAttribute

public class TraceLog : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //filterContext.Controller.ViewData.Model now isn't null
        base.OnActionExecuted(filterContext);
    }
}
于 2014-08-11T18:32:35.127 回答
4

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

(这是对@Steven Lyons 答案的评论,但我将其作为答案发布,因为我无法发表评论。)

于 2019-02-05T10:59:43.993 回答
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, 
    }
于 2017-01-12T00:08:39.053 回答
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);
    }
}

在此处输入图像描述

于 2015-11-17T13:53:39.833 回答