Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Правила перенаправления






Есть две ситуации, которые похожи, но по-разному обрабатываются. Речь идет о перенаправлении страницы на страницу входа и об ошибке 404 (страница не найдена).

Итак, когда мы пытаемся получить по прямой ссылке доступ к админке, но в данный момент мы не залогинены, или залогинены, но не имеем прав на это, нас переправит на страницу, указанную в Web.config в секции authentication:

< authentication mode=" Forms" >

< forms loginUrl=" ~/Login" timeout=" 2880" />

< /authentication>

Если мы пытаемся открыть несуществующую страницу, т.е. по данным роутинга не найден контроллер и action-метод, то нас перенаправляют на страницу, которая указывается в секции customErrors в Web.config:

< customErrors mode=" On" redirectMode=" ResponseRedirect" defaultRedirect=" ~/Error" >

< error statusCode=" 403" redirect=" ~/Error" />

< error statusCode=" 404" redirect=" ~/NotFoundPage" />

< /customErrors>

То же происходит и при обработке ошибки. На боевом сервере не очень хорошо выдавать «желтый экран смерти», где указана причина возникновения ошибки.

Но иногда, перенаправление на страницу 404 или на страницу входа, мы должны сделать самостоятельно.

Эта ситуация может возникнуть, когда проверка роли выполнена, но пользователь берется за управление чужого ресурса, при обращении к которому, естественно, в доступе ему должно быть отказано.

Или второй, и более частый случай, когда по битой ссылке не находится ресурс, в данном случае, надо переправить на NotFoundPage.

Добавим свойства в BaseController (/Controllers/BaseController.cs):

protected static string ErrorPage = " ~/Error";

protected static string NotFoundPage = " ~/NotFoundPage";

 

protected static string LoginPage = " ~/Login";

 

public RedirectResult RedirectToNotFoundPage

{

get

{

return Redirect(NotFoundPage);

}

}

 

public RedirectResult RedirectToLoginPage

{

get

{

return Redirect(LoginPage);

}

}

protected override void OnException(ExceptionContext filterContext)

{

base.OnException(filterContext);

 

filterContext.Result = Redirect(ErrorPage);

}

Теперь можно использовать свойства RedirectToNotFoundPage и RedirectToLoginPage UserController (/Areas/Default/Controllers/UserController.cs) так:

[Authorize]

public ActionResult Edit(int id)

{

var user = Repository.Users.FirstOrDefault(p => p.ID == id);

if (user! = null)

{

if (CurrentUser.InRoles(" admin") || CurrentUser.ID == id)

{

//Разрешено редактирование

return View(user);

}

return RedirectToLoginPage;

}

return RedirectToNotFoundPage;

}

Обратите внимание, изначально необходимо быть авторизованным в системе, но редактирование разрешено только самому пользователю, котого эти данные или пользователю с правами админа.

Добавим обработку ошибки и 404-страницу. Создадим контроллер, но не будем его наследовать от BaseController, чтобы ненароком не зацепить еще какую-нибудь ошибку. Добавим пути маршрутов в обработку (/Areas/Default/DefaultAreaRegistration.cs):

context.MapRoute(

null,

url: " Error",

defaults: new { controller = " Error", action = " Index", id = UrlParameter.Optional },

namespaces: new[] { " LessonProject.Areas.Default.Controllers" }

);

 

context.MapRoute(

null,

url: " NotFoundPage",

defaults: new { controller = " Error", action = " NotFoundPage", id = UrlParameter.Optional },

namespaces: new[] { " LessonProject.Areas.Default.Controllers" }

);

Контроллер (/Areas/Default/Controllers/ErrorController.cs):

public class ErrorController: Controller

{

public ActionResult Index()

{

Response.StatusCode = (int)HttpStatusCode.InternalServerError;

return View();

 

}

 

public ActionResult NotFoundPage()

{

Response.StatusCode = (int)HttpStatusCode.NotFound;

return View();

 

}

}

Добавляем простейшую страницу ошибки View (/Areas/Default/Views/Error/Index.cshtml):

@{

Layout = null;

}

 

<! DOCTYPE html>

 

< html>

< head>

< meta name=" viewport" content=" width=device-width" />

< title> Index< /title>

< /head>

< body>

< div>

Ошибка < br />

< a href=" /" > Вернуться на главную< /a>

< /div>

< /body>

< /html>

 

Аналогичная страница 404 (/Areas/Default/Views/Error/NotFoundPage.cshtml).






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.