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.