2017-06-06 75 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