【发布时间】:2011-01-11 10:02:47
【问题描述】:
在 Global.asax 中,我如何拦截对任何操作/方法的所有调用但那些到某个区域的调用并将所有被阻止的调用重定向到错误页面?
【问题讨论】:
标签: asp.net-mvc routing
在 Global.asax 中,我如何拦截对任何操作/方法的所有调用但那些到某个区域的调用并将所有被阻止的调用重定向到错误页面?
【问题讨论】:
标签: asp.net-mvc routing
最简单的方法可能是更新路由,以便控制器是硬编码的并且是 URL 模板的一部分,而不是使用可以使用任何控制器的默认路由。
如果您想要自定义错误页面而不是 404,请添加另一个匹配任何内容并具有硬编码控制器和操作的路由。
您也可以在 Application_BeginRequest 中按 URL 进行过滤,但这可能比路由所需的两行代码工作量更大。
【讨论】:
区域只是组织代码和分离属于该区域的路线的好方法。话虽如此,您不一定要寻找某个区域,而是要寻找与该区域中的操作相匹配的路线。因此,如果您有一个管理区域,您可能会有如下路线:
context.MapRoute(
"AdminRoute",
"Admin/{controller}/{action}",
new { controller = "Admin", action = "Index" });
您知道这是一个管理区域路由,因为您应该知道哪些路由会调用管理区域控制器中的操作。如果您想以上面的这条路线为例并重定向到错误页面,您可以使用通配符路线:
context.MapRoute(
"AdminErrorRoute",
"Admin/{*url}",
new { controller = "Error", action = "Error" });
这将采用以 /Admin 开头的任何路由并将它们重定向到错误页面。不确定为什么要将所有用户重定向到整个区域的错误页面。如果您只是希望逐个用户使用它,那么请考虑在控制器操作上使用属性过滤器来确定是否应将用户重定向到错误页面。像这样的:
[IsUserAdmin()]
public ActionResult Index() { .. }
【讨论】: