首页 > 解决方案 > 了解 ASP.NET MVC 生命周期:为什么 Model 在 ActionFilter 中不可用?

问题描述

我创建了以下自定义操作过滤器,当我尝试Model在以下代码中访问时,它为空:

public class CustomPermissionCheckAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        OrganisationBaseController orgBaseController = context.Controller as Controller;
        var vm = ((Controller)context.Controller).ViewData.Model as MyViewModel; // null

        // check if current user has permission to vm.OrganisationId

        base.OnActionExecuting(context);
    }
}

我试图理解为什么Model为空?根据ASP.NET MVC Lifecycle,ActionFilters 是在 Model Binder 之后执行的,所以我不确定为什么 Model 不可用?

在此处输入图像描述


这就是我注册上述动作过滤器的方式:

[HttpPost]
[CustomPermissionCheck]
public ActionResult UpdateBranch(MyViewModel myViewModel)
{
    if (ModelState.IsValid)
    {
        // so something 
    }
    return View();
}

标签: asp.net-mvcmodel-bindingaction-filter

解决方案


可以试试这个来访问请求模型:

MyViewModel vm = context.ActionParameters.Values.OfType<MyViewModel>().SingleOrDefault();

如何在动作过滤器中获取当前模型


推荐阅读