2010-10-07 4 views
2

Я хочу заблокировать доступ к странице html (например, /manual/manual_A/index.html) , если определенное условие не выполняется (например, HttpContext.Current.Request.Form ["key"]. ToString() .Equals ("a")), я хочу перенаправить к определенному виду (например./ErrorPage /) else continue (например./Index). В регистре маршрута добавить:Как ограничить доступ к определенным страницам в ASP.NET MVC?

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

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

для чтения всех просьб. В контроллере Home

[CustomAuthorize] 
    public ActionResult Index() 
    { 

    } 

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

OnActionExecuting выполняется на каждом запросе, однако, RedirectToAction не бывает. Любые намеки на то, что я делаю неправильно?

+1

Ваш RedirectToAction и ваши действия маршрутизации не совпадают , вы можете также проверить это (PageError! = ErrorPage) – Tommy

+1

Вы абсолютно уверены, что ваше состояние оценивается как false? Вы можете проверить это под отладчиком? Также помните, что авторизация происходит перед другими фильтрами действий. Если ваш [CustomAuthorize] перехватывает OnAuthorization, вы можете захотеть установить результат из этого фильтра, а не использовать отдельный фильтр действий. – Levi

+0

Привет, я нашел решение своей проблемы. В течение дня поставьте код. Спасибо всем за совет. – user468451

ответ

0

Вам необходимо установить filterContext.Result, как показано ниже, а затем перенаправить на страницу с вашей ошибкой.

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

Это должно решить проблему.

+0

Почему отрицательный голос? Я не говорю, как ограничить доступ. Мой ответ - как остановить действие и перенаправить на другую страницу. – Pradeep

+0

Pradeep - Ваш ответ неверный. В MVC такие методы, как RedirectToAction() и другие фабрики, производящие ActionResult, не имеют побочных эффектов, таких как перенаправление. Чтобы выполнить перенаправление изнутри фильтра, вы устанавливаете свойство Result экземпляру RedirectResult или RedirectToRouteResult в качестве исходного плаката. – Levi

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); 
} 
Смежные вопросы