Правильное использование MasterPages - PullRequest
2 голосов
/ 17 декабря 2009

Я изучал различные методы реализации шедевров.

  1. Используйте мастер-страницу только для макета, включая общие элементы управления на каждой странице
  2. Включите элементы управления на главной странице, используйте абстрактный базовый класс главной страницы и переопределите его свойства в классе главной страницы. Это привело к тому, что события мастер-страницы больше не подключались. Я, наверное, мог бы это исправить, но это долгий путь только для одного значения текстового поля.
  3. используйте хороший 'Page.Master.FindControl ()

Я читал, что следует избегать findcontrol (использует магические строки "label1", предположительно использует слишком много ресурсов), а мастер-страницы предназначены только для макета. Если мастер-страницы предназначены только для макета, могу ли я копировать и вставлять общие элементы управления на 100-е страницы?

Какова наилучшая практика, связанная с отображением и доступом к общим элементам управления сайта (например, к поиску)? Рассматривая альтернативы, использование findcontrol для получения элемента управления masterpage выглядит не так уж плохо.

Ответы [ 2 ]

1 голос
/ 16 февраля 2010

MasterPages - это классы, как обычный объект Page. Это означает, что вы можете предоставлять внутренние элементы управления через открытые свойства, чтобы разрешить дочерним страницам доступ без необходимости прибегать к Master.FindControl (). Для этого вам просто нужно установить свойство MasterType на странице (я думаю, что оно может работать даже без его установки, но при этом вы получаете поддержку intellisense и избегаете необходимости делать приведения).

Вот базовый пример (извините, он в VB - это копирование и вставка из старого проекта):

Главная страница (.master):

<%@ Master Language="VB" CodeFile="default.master.vb" Inherits="DefaultMaster" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form runat="server">
    <ASP:TextBox ID="Search" RunAt="Server"/>
    <ASP:ContentPlaceHolder ID="Content" RunAt="Server"/>
    </form>
</body>
</html>

Мастер-код (.master.vb):

Partial Class DefaultMaster : Inherits MasterPage
    Public ReadOnly Property SearchBox() As TextBox
        Get
            Return Search
        End Get
    End Property
End Class

Доступ к странице (.aspx):

<%@ Page Language="VB" MasterPageFile="default.master" CodeFile="page.aspx.vb" Inherits="ExamplePage" %>
<%@ MasterType TypeName="DefaultMaster" %>

<ASP:Content ContentPlaceHolderID="Content" RunAt="Server">
    <p>This is some content on the page.</p>
</ASP:Content>

Доступ к коду страницы (.aspx.vb):

Partial Class ExamplePage : Inherits Page
    Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles MyBase.Load
        Master.SearchBox.Text = "This page now has access to the master's search box."
    End Sub
End Class
0 голосов
/ 17 декабря 2009

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

...