2014-09-30 64 views
1

不必記住使用ChildActionOnly屬性修飾一堆操作方法,而是可以方便地指定整個控制器中的所有方法。制定控制器的所有操作方法ChildActionOnly

試圖將ChildActionOnly屬性放在控制器類上不起作用(至少在我的代碼上下文中),因爲在控制器的依賴項注入期間(在請求管道的早期階段發生),沒有HttpContext或請求對象,並拋出錯誤「請求在此上下文中不可用」。

我可以創建一個RouteConstraint,使路由本身執行ChildActionOnly?這似乎有疑問,因爲相同的請求管道問題 - 我不知道HttpContext在執行RouteConstraints期間是否可用。如果你有想法如何實現這一點,請分享。

也許創建一個使用反射來識別特定控制器的所有操作方法,並確保他們有ChildActionOnly屬性設置的單元測試...

如何做到這一點?你可以給一些入門代碼(不需要打磨或者甚至可以工作,只需要一個起點就可以)。

回答

0

過濾器怎麼樣?您可以創建自定義過濾器,然後將過濾器添加到FilterConfig。 MVC中的過濾器允許您在執行操作之前/之後爲您添加業務邏輯(代碼),在示例中,對於操作的每個請求,它將首先執行,然後執行操作,並且您可以訪問:

HttpContext.Current.Session filterContext.HttpContext.Request

,你可以重定向

filterContext.Result =新RedirectResult。

存在不同類型的過濾器的: 1.認證濾波器(新中ASP.NET MVC5) 2.授權濾波器 3.動作濾波器 4.結果濾波器 5.異常濾波器

在示例下面,我創建一個自定義過濾器授權

public class CustomFilter : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 

     if (!UserRepository.IsValidUserBy(HttpContext.Current.Session["userName"].ToString())) 
      { 
       filterContext.Result = new RedirectResult("~/User/AccessDenied", true); 
      } 
    } 
    } 

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new MyExpirePageActionFilterAttribute()); 
     filters.Add(new CustomFilter()); 

    } 
+0

感謝您的建議。由於我不是MVC的專家,你能否給出更多關於如何使用過濾器的細節 - 如果僅僅是爲了下一個發現這個問題的人的完整性? – ErikE 2014-10-02 06:11:01

+0

我更新了答案 – 2014-10-02 14:01:28

+0

希望這可以幫助你實現你的目標 – 2014-10-02 14:07:50

2

我發現這個問題和答案,同時谷歌如何實現這個自己。
雖然這個問題專門針對MVC4,我的回答並不直接適用於,它似乎還是有關指出使用對整個控制器的[ChildActionOnly]屬性,使得下面可能是MVC 5現在支持:

namespace MyWebApp.Controllers 
{ 
    [ChildActionOnly] 
    public class MyController 
    { 
     //Can only be called from another action 
     public ActionResult MyAction() 
     { 
     return View(); 
     } 
    } 
} 

其中,直接導航到http://myapp.com/MyController/MyAction導致以下返回時:

Server Error in '/' Application. 

The action 'MyAction' is accessible only by a child request. 
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace 

有關錯誤的詳細信息而且它起源於 的代碼。

Exception Details: System.InvalidOperationException: The action 'MyAction' is accessible only by a child request. 
相關問題