Asp.net mvc 4 将控制器的所有动作方法设为ChildActionOnly

Asp.net mvc 4 将控制器的所有动作方法设为ChildActionOnly,asp.net-mvc-4,child-actions,Asp.net Mvc 4,Child Actions,不必记住用ChildActionOnly属性修饰一堆动作方法,可以方便地指定整个控制器中的所有方法 尝试在控制器类上放置ChildActionOnly属性不起作用(至少在我的代码上下文中),因为在请求管道的早期阶段发生的控制器依赖项注入期间,没有HttpContext或请求对象,并且出现错误“请求在此上下文中不可用”被抛出 我是否可以创建一个RouteConstraint,使路由本身强制执行ChildActionOnly?由于同样的请求管道问题,这似乎值得怀疑——我不知道在执行RouteCons

不必记住用
ChildActionOnly
属性修饰一堆动作方法,可以方便地指定整个控制器中的所有方法

尝试在控制器类上放置
ChildActionOnly
属性不起作用(至少在我的代码上下文中),因为在请求管道的早期阶段发生的控制器依赖项注入期间,没有HttpContext或请求对象,并且出现错误“请求在此上下文中不可用”被抛出

我是否可以创建一个
RouteConstraint
,使路由本身强制执行
ChildActionOnly
?由于同样的请求管道问题,这似乎值得怀疑——我不知道在执行RouteConstraint期间HttpContext是否可用。如果你对如何实现这一点有想法,请分享

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


我如何做到这一点?你能给出一些起始代码吗(不需要修饰,甚至不需要工作,只要一个起始点就可以了)。

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

HttpContext.Current.Session filterContext.HttpContext.Request

你可以重定向

filterContext.Result=新重定向结果

存在不同类型的过滤器: 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 ());

    }

我在谷歌搜索如何实现这一目标时发现了这个问题和答案。
虽然这个问题专门针对MVC4,而我的答案并不直接适用于此,但指出MVC 5现在支持在整个控制器上使用
[ChildActionOnly]
属性似乎仍然是相关的,这使得以下操作成为可能:

namespace MyWebApp.Controllers
{
   [ChildActionOnly]
   public class MyController
   {
      //Can only be called from another action
      public ActionResult MyAction()
      {
         return View();
      }
   }
}
当直接导航到时,将返回以下结果:

有关错误以及错误来源的详细信息,请参阅 代码


谢谢你的建议。既然我不是MVC方面的专家,你能再详细介绍一下如何使用过滤器吗?如果只是为了下一个发现这个问题的人的完整性,希望这能帮助你实现你的目标
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.