2010-10-07 3 views
2

Je souhaite verrouiller l'accès à la page html (par exemple /manual/manual_A/index.html) si une certaine condition n'est pas remplie (par exemple HttpContext.Current.Request.Form ["key"]. ToString() .Equals ("a")), je souhaite rediriger vers une vue spécifique (par exemple/errorPage /) sinon continuer (par exemple/index). dans le registre Route ajouter:Comment puis-je restreindre l'accès à certaines pages dans ASP.NET MVC?

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

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

pour lire toutes les demandes. Dans contrôleur Accueil

[CustomAuthorize] 
    public ActionResult Index() 
    { 

    } 

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

OnActionExecuting exécute à chaque requête, cependant, RedirectToAction ne se produit pas. Des indices sur ce que je fais de mal?

+1

Votre RedirectToAction et vos actions de routage ne correspondent pas , vous pouvez vouloir vérifier cela aussi (PageError! = ErrorPage) – Tommy

+1

Êtes-vous absolument certain que votre condition évalue à faux? Pouvez-vous vérifier cela sous un débogueur? Rappelez-vous également que l'autorisation se produit avant les autres filtres d'action. Si votre [CustomAuthorize] accroche OnAuthorization, vous voudrez peut-être définir le résultat à partir de ce filtre plutôt que d'avoir un filtre d'action distinct. – Levi

+0

Salut, j'ai trouvé la solution à mon problème. Pendant la journée, mettez le code disponible. Merci à tous pour les conseils. – user468451

Répondre

0

Vous devez définir votre filterContext.Result comme indiqué ci-dessous, puis rediriger vers votre page d'erreur.

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

Cela devrait résoudre le problème.

+0

Pourquoi un vote négatif? Je ne dis pas comment restreindre l'accès. Ma réponse est comment arrêter l'action et rediriger vers une autre page. – Pradeep

+0

Pradeep - Votre réponse est incorrecte. Dans MVC, des méthodes telles que RedirectToAction() et d'autres usines productrices d'ActionResult n'ont pas d'effets secondaires comme la redirection. Pour effectuer une redirection à partir d'un filtre, vous définissez la propriété Result à une instance de RedirectResult ou RedirectToRouteResult comme l'a fait l'affiche d'origine. – Levi

0

Ceci est ma solution. En 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"}); 
} 

dans le contrôleur, j'utilise une session en mémoire la condition:

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"); 
} 

En AuthorizeAttribute:

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