Атрибут ASP.NET CodeFileBaseClass и наследование от System.Web.UI.Page

Я только что создал базовый класс для своих страниц, унаследовав его от System.Web.UI.Page:

public abstract class PageBase : System.Web.UI.Page
{
    ...
}

Когда я заметил, что вы также можете объявить базовую страницу в представлении ASP.NET:

<%@ Page Language="C#" CodeFileBaseClass="PageBase.cs" CodeFile="page.aspx.cs"
    Inherits="page" %>

Может кто-нибудь объяснить, каковы плюсы и минусы того или иного метода? Когда бы вы использовали один над другим, или они оба одинаковы? Что произойдет, если вы использовали оба одновременно?


person Daniel T.    schedule 07.06.2012    source источник


Ответы (1)


CodeFileBaseClass, CodeFile, Inherits работают вместе с наследованием, а не вместо наследования.

Например, указание CodeFile="page.aspx.cs" без существующего page.aspx.cs приведет к следующему результату:

Parser Error Message: The file '/page.aspx.cs' does not exist.

Предполагая, что page.aspx.cs существует, указание CodeFileBaseClass="PageBase.cs" без существующего PageBase.cs приведет к:

Parser Error Message: Could not load type 'PageBase.cs'.

С другой стороны, вы можете наследовать от PageBase без указания атрибута CodeFileBaseClass. Однако это может привести к неожиданному поведению при обращении к элементам управления на странице из базового класса.

Цитата из документации Microsoft @Page MSDN:

CodeFileBaseClass
Указывает имя типа базового класса для страницы и связанного с ним класса кода программной части. Этот атрибут является необязательным, но при его использовании также должен присутствовать атрибут CodeFile. Используйте этот атрибут, если вы хотите реализовать общий сценарий, в котором вы определяете общие поля (и, возможно, связанные события) в базовом классе для ссылки на элементы управления, объявленные на веб-странице. Из-за модели генерации кода ASP.NET, если вы определили поля в базовом классе без использования этого атрибута, во время компиляции будут созданы новые определения элементов для элементов управления, объявленных на веб-странице (в отдельной заглушке частичного класса), и ваш желаемый сценарий не будет работать. Но если вы используете атрибут CodeFileBaseClass, чтобы связать базовый класс со страницей, и создаете свой разделяемый класс (его имя назначается атрибуту Inherits, а его исходный файл на которые ссылается атрибут CodeFile), наследуются от базового класса, то поля в базовом классе смогут ссылаться на элементы управления на странице после генерации кода.

person Nope    schedule 07.06.2012
comment
Спасибо. Означает ли это, что на всякий случай всегда используйте атрибут CodeFileBaseClass и наследуйте от базового класса? - person Daniel T.; 08.06.2012
comment
Кажется, что если вы собираетесь совместно использовать поля в базовом классе, которые ссылаются на элементы управления на странице, и не указываете необходимые атрибуты страницы, целостность этих ссылок ненадежна из-за процесса генерации кода ASP NET, как описано в цитируемый текст. - person Nope; 08.06.2012
comment
Извините, что отвечаю на ваш вопрос. Я бы кодировал только то, что нужно. Если я правильно понял справку MSDN, кажется, что только если вы совместно используете поля в своем базовом классе, которые ссылаются на элементы управления на странице, вы также должны указать необходимые атрибуты страницы для предотвращения нежелательных результатов. Однако если вы делитесь только полями, которые не ссылаются на элементы управления на странице, то им не нужно назначать атрибуты страницы. - person Nope; 08.06.2012