2010-10-07 122 views
2

如果不符合某些条件(例如HttpContext.Current.Request.Form [“key”]。toString()),我希望锁定对html页面的访问(例如./manual/manual_A/index.html) 。 .Equals(“a”)),我希望重定向到特定的视图(例如./errorPage/),否则继续(例如/ index)。 In register Route I add:如何限制对ASP.NET MVC中某些页面的访问?

routes.MapRoute(
       "ErrorPage",            
       "errorPage/",       
       new { controller = "Home", action = "ErrorPage" } 
      ); 

routes.MapRoute(
       "Path",            
       "{*_request}",       
       new { controller = "Home", action = "Index" } 
      ); 

用于读取所有请求。 在控制器首页

[CustomAuthorize] 
    public ActionResult Index() 
    { 

    } 

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(!condition) 
      filterContext.Result = RedirectToAction("PageError"); 
    } 

OnActionExecuting执行每个请求,然而,RedirectToAction不会发生。 任何提示我做错了什么?

+1

你redirectToAction和你的路由的行动不匹配,你可能也想检查一下(PageError!= ErrorPage) – Tommy 2010-10-07 13:50:32

+1

你是否绝对肯定你的条件正在评估为false?你可以在调试器下验证它吗?另请记住,授权在其他操作过滤器之前发生。如果您的[CustomAuthorize]挂钩了OnAuthorization,您可能实际上希望从该过滤器中设置Result,而不是使用单独的操作过滤器执行此操作。 – Levi 2010-10-07 16:54:52

+0

嗨,我找到了解决我的问题。在白天把代码提供。感谢大家的建议。 – user468451 2010-10-08 04:36:08

回答

0

您需要设置filterContext.Result(如下所示),然后重定向到您的错误页面。

filterContext.Result = new EmptyResult(); 
RedirectToAction("PageError"); 

这应该解决问题。

+0

为什么反对投票?我不告诉如何限制访问。我的回答是如何停止操作并重定向到其他页面。 – Pradeep 2010-10-07 07:29:23

+0

Pradeep - 你的回答是不正确的。在MVC中,诸如RedirectToAction()和其他产生ActionResult的工厂等方法没有类似重定向的副作用。要从过滤器中执行重定向,可以将Result属性设置为原始海报完成后的RedirectResult或RedirectToRouteResult实例。 – Levi 2010-10-07 16:51:06

0

这是我的解决方案。 在Globax.asax:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.RouteExistingFiles = true; 
    routes.MapRoute("PageError", "PageError/", new { controller = "Home", action = "PageError" }); 
    routes.MapRoute("PathPageStatic", "PathPageStatic/", new { controller = "Home", action = "PathPageStatic" }); 
    routes.MapRoute("Path", "{*_request}", new { controller = "Home", action = "Index"}); 
} 

在控制器中,我使用一个会话内存的条件:

public ActionResult PathPageStatic() 
{ 
    if (condition) 
    { 
    Session["key"] = condition; 
    return View("Index"); 
    } 
    else 
    return RedirectToRoute("PageError"); 
} 

[UserAuthorize] 
public ActionResult Index() 
{ 
    string patternStaticFile = @"\.*.(htm|html)"; 
    if (Regex.IsMatch(HttpContext.Request.Url.AbsoluteUri, patternStaticFile)) 
    { 
     string pathFile = HttpContext.Request.Url.LocalPath; 
     if (System.IO.File.Exists(pathFile)) 
     return new FilePathResult(pathFile, MimeType(pathFile)); 
     else return null; 
    } 
    else 
     return View(); 
} 

public ActionResult PageError() 
{ 
    return View("PageError"); 
} 

在AuthorizeAttribute:

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (HttpContext.Current.Session["key"] == null) 
     filterContext.HttpContext.Response.Redirect("~/PageError", true); 
} 
相关问题