ASP.NET主頁 - 基本的東西。我想要一個主用戶控件(一個母版頁,但用於UserControls)
但是,我的項目中有很多非常類似的UserControls - 它可能是AJAX ModalPopup的標準佈局,或者更多涉及的東西。
我希望我可以擺脫一些重複的代碼(在ascx文件和代碼隱藏)與一些主用戶控件。
有沒有人有任何建議的方式來實現這一目標?
ASP.NET主頁 - 基本的東西。我想要一個主用戶控件(一個母版頁,但用於UserControls)
但是,我的項目中有很多非常類似的UserControls - 它可能是AJAX ModalPopup的標準佈局,或者更多涉及的東西。
我希望我可以擺脫一些重複的代碼(在ascx文件和代碼隱藏)與一些主用戶控件。
有沒有人有任何建議的方式來實現這一目標?
我可以建議你最想找的東西是templated custom control。不幸的是,如果這些東西是自定義控件,並且沒有ascx文件,跨項目共享控件會更容易。
繼承。您將基礎控件構建爲基類,然後從中繼承。
您也可以將嵌套用戶控件放置在「主」用戶控件中的佔位符控件上。 使用Load方法接受到ascx文件的虛擬路徑來加載適當的控件。
我設法得到這個使用下面的代碼工作:
public class MasterLoader : UserControl
{
MasterUserControl _masterUserControl;
protected override void CreateChildControls()
{
Controls.Clear();
base.CreateChildControls();
Controls.Add(MasterControl);
}
protected override void AddedControl(Control control, int index)
{
if (control is MasterUserControl)
base.AddedControl(control, index);
else
MasterControl.ContentArea.Controls.Add(control);
}
private MasterUserControl MasterControl
{
get
{
if (_masterUserControl== null)
_masterUserControl= (MasterUserControl)LoadControl("~/MasterUserControl.ascx");
return _masterUserControl;
}
}
}
兒童用戶控件從MasterLoader類繼承。主用戶控件包含一個佔位符控件,我將其公開爲名爲ContentArea的公共屬性。
public partial class MasterUserControl: UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
public PlaceHolder ContentArea
{
get
{
return phContent;
}
}
}
事件綁定和視圖狀態按預期工作,不會對任何用戶控件進行任何更改。
這是一個老問題,但我有一個強大的解決方案,任何人誰絆倒在這。
在App_Code文件,創建一個文件並粘貼此代碼:
namespace MasterControls
{
// code written by alexander taylor on 2011-08-22. http://www.alexsapps.com
public abstract class ChildUserControl : UserControl
{
Control master;
public abstract string MasterControlVirtualPath { get; }
protected override void OnInit(EventArgs e)
{
master = LoadControl(MasterControlVirtualPath);
Controls.Add(master);
base.OnInit(e);
}
protected override void Render(HtmlTextWriter writer)
{
master.RenderControl(writer);
}
}
public class ControlContentPlaceHolder : Control
{
protected override void Render(HtmlTextWriter writer)
{
ControlContent found = null;
foreach (Control c in NamingContainer.NamingContainer.Controls)
{
ControlContent search;
search = c as ControlContent;
if (search != null && search.ControlContentPlaceHolderID.Equals(ID))
{
found = search;
break;
}
}
if (found != null)
{
//write content of the ContentControl
found.RenderControl(writer);
}
else
{
//use default content
base.Render(writer);
}
}
}
public class ControlContent : Control
{
public string ControlContentPlaceHolderID { get; set; }
}
}
例如 「主控」(母版頁的等值)
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MasterControl1.ascx.cs" Inherits="MasterControl1" %>
<%@ Register Namespace="MasterControls" TagPrefix="masterControls" %>
<p>content 1 below:<br />
<masterControls:ControlContentPlaceHolder ID="myContent1" runat="server">
default content 1 here!
</masterControls:ControlContentPlaceHolder></p>
<p>content 2 below:<br />
<masterControls:ControlContentPlaceHolder ID="myContent2" runat="server">
default content 2 here!
</masterControls:ControlContentPlaceHolder></p>
例如 「子控件」(頁當量)
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ChildControl1.ascx.cs" Inherits="Control1" %>
<%@ Register Namespace="MasterControls" TagPrefix="masterControls" %>
<masterControls:ControlContent ControlContentPlaceHolderID="myContent1" runat="server">
custom content 1
</masterControls:ControlContent>
<masterControls:ControlContent ControlContentPlaceHolderID="myContent2" runat="server">
custom content 2
</masterControls:ControlContent>
在子控件後面的代碼
using MasterControls;
//you must inherit the ChildUserControl class!
public partial class Control1 : ChildUserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
public override string MasterControlVirtualPath
{
//below, type the location to the master control
//you wish to apply to this control
get { return "~/MasterControl1.ascx"; }
}
}
我已經完成了代碼背後的事情(即我的UserControl.ascx.cs文件繼承自我的BaseUserControl而不是System.Web.UI.UserControl。 但是,這對我在基本控件中添加標準HTML和服務器控件方面有所幫助。 – 2008-12-02 15:26:30