2015-11-24 2 views
0

Я работаю над новым проектом asp.NET (для конкретной версии .NET 4.5). Я пытаюсь создать этот проект, используя лучшие практики, но, к сожалению, я не знаю терминологию, чтобы искать в этом случае - надеюсь, этот вопрос даст понять.Ссылка 'this' на главной странице

После создания нового проекта из шаблона по умолчанию я получаю страницы, необходимые для системы входа в систему. Теперь я хочу сделать так, чтобы весь сайт требовал входа в систему, прежде чем вам разрешат увидеть какой-либо контент. Для этого я просто проверяю, зарегистрирован ли ваш пользователь на загрузке страницы, а если нет, перенаправляйте вас на страницу входа.

Вот что у меня есть до сих пор - он отлично работает, но не является «глобальным».

На отдельной странице:

protected void Page_Load(object sender, EventArgs e) 
{ 
    //If the user isn't logged in, make them log in 
    redirectIfNotLoggedIn(this); 
} 

public static void redirectIfNotLoggedIn(_Default _Default) 
{ 
    if (!_Default.User.Identity.IsAuthenticated) { _Default.Response.Redirect("~/Account/Login.aspx"); } 
} 

Он работает - если я не вошли в систему, это приводит меня к странице Login.aspx. Если я вошел в систему, я могу перемещаться по сайту. Проблема с этим кодом заключается в том, что мне придется копировать и вставлять его на каждую страницу. Поэтому я хотел бы поместить этот код в Page_Load файла Site.Master, который заставит пользователя пройти аутентификацию независимо от того, на какой странице они пытаются получить доступ. Однако я не могу использовать «этот» контекст в Site.Master, что имеет смысл, но я не знаю, что такое альтернатива.

Я собираюсь сделать это правильно? Есть ли способ лучше? Как я могу сделать требование аутентификации «глобальным» для каждой страницы проекта?

+0

Вы можете взглянуть на https://msdn.microsoft.com/en-us/library/gg416513%28VS.98% 29.aspx? F = 255 & MSPPError = -2147217396 и, в частности, фильтры авторизации. – Chris

+0

Почему вы не можете использовать 'this' в главном файле? – DavidG

+0

@ Крис Я сейчас читаю страницы, что именно я должен искать? Где бы я поместил такой фильтр? – Jake

ответ

2

В MasterPage вы можете использовать this.Page, чтобы получить объект страницы, который вы ищете.

Но также рассмотреть другой способ сделать это: Я обычно создаю класс MyBasePage, унаследовав от System.Web.UI.Page, и поставить там все (или большинство) из общей логики разделяемой всеми страницами в моем веб-приложение.

Затем я создаю каждую страницу, изменяющую базовый класс от System.Web.UI.Page до MyBasePage

+0

Я считаю, что это работает, хотя я, кажется, нашел небольшой недостаток в своем плане, поскольку теперь он перенаправляет вас в/Account/Login независимо от того, даже если это страница, на которую вы пытаетесь перейти - в результате постоянные переадресации ... Я это исправлю! Что касается остальной части вашего комментария, каковы причины для этого, в отличие от моего пути? – Jake

+0

Использование MyPageBase позволяет создать общее поведение для всех ваших страниц. В конце концов, вы можете написать этот класс с помощью виртуального метода/свойств и переопределить их только на одной конкретной странице, если вы хотите изменить поведение по умолчанию. Вы можете сделать что-то подобное, используя MasterPage, но мне легче работать с ним на уровне страницы, а не на MasterPage. Возможно, это вопрос вкуса, но я считаю его более гибким, используя метод наследования вместо MasterPage. –

+0

Предположим, вам нужна переменная-член 'CurrentUser' на всех ваших страницах: проще ли хранить ее в« MyPageBase »или в MasterPage, имея ссылку на нее на каждой странице как« (MyMasterPage) this.MasterPage.CurrentUser'? –

Смежные вопросы