所有Controller类的全局方法ASP.NET MVC

时间:2017-06-06 13:28:28

标签: c# asp.net-mvc

我有很多不同的控制器,每个都包含很多 ActionResult方法,它们会返回不同的视图。

在我的程序中,您可以在开始使用之前设置变量。我将变量存储在 Session

目前,我的大多数控制器都使用相同的 if-sentence 方法。 示例:

        if (Session["myVariable"] == null)
        {
            return RedirectToAction("/../Cons/SetVariable");
        }

我想要的是不要在我的所有控制器方法中编写这个逻辑。也许有一种方法可以用逻辑或类似的东西扩展一个新的控制器?

我希望有人能理解我的问题并提供帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用MVC / WebAPI的过滤器属性来执行检查和使用上下文来执行操作

public class VariableCheckerValidationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext 
    filterContext)
    {
        if(filterContext.HttpContext.Session["myVariable"] == null)
        {
            filterContext.Result = new RedirectToRouteResult("/../Cons/SetVariable"‌, filterContext.RouteData.Values);
        }
    }
}

然后将动作过滤器注册为全局过滤器,它将自动应用于应用程序中的每个操作。

在WebApiConfig中(对于WebAPI项目),通常在Register方法中添加:

config.Filters.Add(new VariableCheckerValidationAttribute());

或者,根据需要应用于控制器或操作级别。

如果您决定转到全局应用程序,并且您有一个不需要它的操作,那么您需要在策略之外创建一个“异常”属性,并更新上面的属性代码以进行测试如果存在'exception'属性,那么在那种情况下不应用检查。