Базовая страница в ASP.NET

Рекомендуете ли вы на каждом веб-сайте, созданном в Visual Studio, создать базовую страницу, которая будет служить родительским классом?

Каковы конкретные преимущества/недостатки?

Ответ 1

Если вы хотите переопределить то, что работает в ASP.NET, может быть более эффективным создание его в базовый класс, а не включение кода на каждой странице. Два конкретных случая, когда я это сделал, следующие:

IsPostBack
Малоизвестный факт: вполне возможно обработать запрос, который для ASP.NET выглядит как обратная передача, но отправляется с запросом GET. Кто это делает? Хакеры, это кто. Вызов IsPostback в этом случае вернет true, но он действительно вернет false. Чтобы обойти это, создайте базовый класс, который переопределяет IsPostBack:

Public Class MyBase
    Inherits System.Web.UI.Page
    <DebuggerStepThrough()> _
    Public Shadows Function IsPostback() As Boolean

        'Check the built-in IsPostback and make sure this is a HTTP POST
        Return (Page.IsPostBack AndAlso Request.HttpMethod.ToUpper = "POST")

    End Function

End Class

Обработка ошибок
В Начиная защиту ASP.NET, Blowdart говорит о том, что if вы используете обработку ошибок ASP.NET для перенаправления клиента на страницу пользовательских ошибок, хакеры (снова) могут обнаружить перенаправление и пометить его как ошибку, которая может быть использована. Более безопасный шаблон предназначен для обработки события ошибки страницы и выполнения Server.Transfer(который ничего не передает клиенту). Опять же, делать это в базовом классе означает, что вы только пишете код один раз:

public partial MyBase : System.Web.UI.Page
{
    protected void Page_Error (object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        // Do something with the exception e.g. log it
        ...

        Server.Transfer("~/mycustomerrorpage.aspx");
     }
}

Ответ 2

Да, знаю.

Но помните, что цель базовой страницы полностью отличается от цели главной страницы .

Позвольте мне объяснить.

Мастер-страницы

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

Базовые страницы

(абстрактные? по крайней мере, не запечатанные!) классы, из которых все ваши страницы наследуются от представления кода. Если вы явно не используете программно, добавьте элементы управления на страницу basae, то есть. в конструкторе с помощью метода LoadControl все страницы будут выглядеть пустым с самого начала, пока вы не добавите код.

Но часто они полезны. Если вы хотите переопределить некоторые методы базового класса, вы можете иметь поведение переопределения на всех страницах. Или вы можете захотеть подвергнуть объекты приложения конкретным объектам на дочерние страницы (ссылку на уровень доступа к данным, регистратор или что-то еще). Примером является переопределение свойства UICulture для извлечения предпочитаемого пользователем языка из файлов cookie.

Оба могут быть объединены

В зависимости от ваших целей вы можете комбинировать основные страницы с базовыми страницами.

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

Ответ 3

Проверьте основные страницы, это их основная цель.

Здесь ссылка: http://msdn.microsoft.com/en-us/library/wtxbf3hh.aspx

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

Кроме того, как отмечали другие. Если вы используете какой-либо Commond-код, просто создайте класс ссылкой, где бы вы ни находились.

Ответ 4

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

Чтобы создать базовую страницу для использования в сценарии главной страницы, вы можете использовать следующий синтаксис:

Мастер-страница:

 <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="MyProject.master.cs"
        Inherits="MyProject.MasterPages.MyProject" %>

    <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">   
    </asp:ContentPlaceHolder>

Базовая страница:

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPages/MyProject.Master"
    AutoEventWireup="true" CodeBehind="BasePage.aspx.cs"
        Inherits="MyProject.BasePage" %>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"
    runat="server">
</asp:Content>

Страница содержания:

<%@ Page Title="MyProject - Home" Language="C#"
    MasterPageFile="~/MasterPages/MyProject.Master" AutoEventWireup="true"
        CodeFileBaseClass="MyProject.BasePage" CodeFile="Default.aspx.cs"
            Inherits="MyProject.Default"
                Meta_Description="Code Snippet: Master Page and Base Page"
                    Meta_Keywords="master, base, content" Theme="Style" %>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"
   runat="server">
</asp:Content>

Ответ 5

Если вам нужна общая функциональность на всех ваших страницах, принадлежащих классу страниц, создайте общий базовый класс.

Если вам не нужны такие общие функции на всех ваших страницах, не создавайте общий базовый класс.

Если вы не можете решить, что базовый класс никому не повредит, значит, у вас тоже может быть один (я бы сказал, что вам чаще всего нужны некоторые общие функции, чем нет)