制作控制器ChildActionOnly的所有操作方法

时间:2014-09-30 21:54:51

标签: asp.net-mvc-4 child-actions

不必记住使用ChildActionOnly属性修饰一堆操作方法,而是能够在整个控制器中指定所有方法,这样会很方便。

尝试将ChildActionOnly属性放在控制器类上并不起作用(至少在我的代码上下文中),因为在控制器的依赖注入期间,这发生在请求管道的早期阶段,没有HttpContext或Request对象,并且错误"请求在此上下文中不可用"扔了。

我可以创建一个RouteConstraint,使路线本身强制执行ChildActionOnly吗?由于相同的请求管道问题,这似乎令人怀疑 - 我不知道在执行RouteConstraints期间HttpContext是否可用。如果您有如何实现这一点的想法,请分享。

也许创建一个单元测试,使用反射来发现特定控制器的所有操作方法,并确保它们具有ChildActionOnly属性集......

我如何做到这一点?你能给出一些入门代码(不需要打磨甚至工作,只是一个起点会有所帮助)。

2 个答案:

答案 0 :(得分:2)

我在谷歌搜索如何自己完成这个问题时找到了这个问题和答案 虽然这个问题专门针对MVC4,而我的答案并不直接适用于此,但似乎有必要指出MVC 5现在支持在整个Controller上使用[ChildActionOnly]属性,使以下成为可能:

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.

答案 1 :(得分:0)

过滤器怎么样?您可以创建自定义过滤器,然后只需将过滤器添加到FilterConfig。 MVC中的过滤器允许您在执行操作之前/之后添加业务逻辑(代码),在每个动作请求的示例中,它将首先执行,然后执行操作,您可以访问:

HttpContext.Current.Session filterContext.HttpContext.Request

您可以重定向

filterContext.Result = new RedirectResult。

存在不同类型的过滤器: 1.身份验证过滤器(ASP.NET MVC5中的新增功能) 2.授权过滤器 3.动作过滤器 4.结果过滤器 5.例外过滤器

在下面的示例中,我为Authorization

创建了一个自定义过滤器
 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 ());

    }