2014-09-30 65 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. 
相关问题