不必记住使用ChildActionOnly
属性修饰一堆操作方法,而是能够在整个控制器中指定所有方法,这样会很方便。
尝试将ChildActionOnly
属性放在控制器类上并不起作用(至少在我的代码上下文中),因为在控制器的依赖注入期间,这发生在请求管道的早期阶段,没有HttpContext或Request对象,并且错误"请求在此上下文中不可用"扔了。
我可以创建一个RouteConstraint
,使路线本身强制执行ChildActionOnly
吗?由于相同的请求管道问题,这似乎令人怀疑 - 我不知道在执行RouteConstraints期间HttpContext是否可用。如果您有如何实现这一点的想法,请分享。
也许创建一个单元测试,使用反射来发现特定控制器的所有操作方法,并确保它们具有ChildActionOnly
属性集......
我如何做到这一点?你能给出一些入门代码(不需要打磨甚至工作,只是一个起点会有所帮助)。
答案 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 ());
}