2010-02-23 83 views
3

簡而言之:是否有任何知道從基礎控制器獲取應用於當前執行操作的actionFilters列表的方法?從基礎控制器獲取操作過濾器列表

長: 我使用ASP.NET MVC 1.0框架。我有一個「RequireSSL」actionFilter,我重新創建用於檢出,但是,如果某人離開結帳並返回商店,我想將它們轉發回非安全版本的網站。

這將有助於在基本控制器(我正在使用自定義的基礎控制器,從默認控制器繼承)找出什麼actionFilters正在應用到當前操作。

我可以包括這個到global.asax.cs我想,任何指導在這裏將不勝感激。

感謝

回答

3

您可以創建一個ActionFilter和實施OnActionExecuting。從這個屬性你可以重定向他們。

public sealed class MyRedirectAttributeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if (!filterContext.ActionDescriptor.IsDefined(typeof(RequireSSLAttribute), true)) 
     { 
      filterContext.HttpContext.Response.Redirect("~/Controller/Action"); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
}true 
+0

難道我有這個過濾器添加到每一個行動? 當前的設置,我有一個名爲「RequireSSL」的actionFilter,如果該操作具有此過濾器,將瀏覽器轉發到SSL會很好,但對於所有非ssl操作,我不想要求應用另一個過濾器基本上這樣做,以便每一個行動需要一個非ssl或ssl所需的過濾器將是一個糟糕的方式去我認爲.. – Ethode 2010-02-23 19:43:29

+0

這是放在BaseController不是每個動作。它測試運行操作。 我們做了類似的事情。 RedirectAttribute根據它在動作中找到的屬性來進行分支。該動作的屬性不是ActionFilter。 – Thad 2010-02-23 20:03:35

+0

我沒有添加到我的基礎控制器的初始化方法,但它似乎沒有運行..我覺得奇怪..是否有另一個位置,我應該把它? – Ethode 2010-02-23 21:38:05

1

好了,這裏是我結束了..

public sealed class HandleConnectionSecurityAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpRequestBase req = filterContext.HttpContext.Request; 
     HttpResponseBase res = filterContext.HttpContext.Response; 

     if (!filterContext.ActionDescriptor.IsDefined(typeof(RequiresSSL), true) && HttpContext.Current.Request.IsSecureConnection) 
     { 
      var builder = new UriBuilder(req.Url) 
      { 
       Scheme = Uri.UriSchemeHttp, 
       Port = 80 
      }; 
      res.Redirect(builder.Uri.ToString()); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

然後我增加了一個action屬性到我創建的SuperController。

[HandleConnectionSecurity]
公共類SuperController:控制器