我一直在研究实现masterpages的不同方法。
我已经读过应该避免使用findcontrol(使用魔术“label1”字符串,据说使用太多资源)并且masterpages仅用于布局。如果masterpages仅用于布局,我是否可以在100页的页面中复制和粘贴常用控件?
处理显示和访问常用网站控件(如搜索)的最佳做法是什么?考虑到替代方案,使用findcontrol获取母版页控件似乎并不那么糟糕。
答案 0 :(得分:1)
MasterPages就像普通的Page对象一样。这意味着您可以通过公共属性公开内部控件,以允许子页面访问而无需求助于Master.FindControl()。要做到这一点,你只需要在页面中设置MasterType属性(我认为它甚至可以在没有设置的情况下工作,但是这样你可以获得智能感知支持并避免必须进行强制转换)。
这是一个基本的例子(抱歉,它是在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
答案 1 :(得分:0)
同意母版页仅用于布局,这是一种明智的方法,不会将公共控件分配给用户控件,并以这种方式将它们包含在母版页中。