2017-06-06 77 views
1

我有很多不同的控制器,它们每个都包含很多ActionResult方法,它返回不同的视图。所有控制器类的全局方法ASP.NET MVC

在我的程序中,您在开始使用它之前设置了一个变量。我将变量存储在会话中。

现在,我的大多数控制器都有相同的方法if-句子例子:

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

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

我希望有人了解我的问题,并可以提供帮助。

+2

也许你应该看看动作过滤器。 – dcg

回答

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

或者,相反,根据需要在控制器或动作级别应用。

如果您决定转向全局应用程序,并且您有一个不需要它的操作,那么您需要创建一个属性到“策略外”,并将上述属性代码更新为测试是否存在“例外”属性,然后在该情况下不应用检查。

+0

没问题。是否不需要全局注册'VariableCheckerValidationAttribute'? – dcg

+1

@dcg,当您输入最后一条评论时,我只是扩大了我的答案。是的,如果它是全球适用。如果不是,那么它可以应用于每个控制器或每个操作方法,就像任何其他验证属性一样。 – LB2

+0

感谢您的好评。我在RedirectToAction上得到一个错误,说这个名字在当前上下文中不存在。是否有一个特殊的地方我应该创建VariableCheckerValidationAttribute类? – crellee