Önerilen çözümüm aşağıda. Tüm ana sayfaların aynı yer tutucu kontrol kümesini (şaşırtıcı değil) uygulamaya koyması gerektiği gibi, birkaç kısıtlaması vardır. Bir bak ve ne düşündüğünü bilmeme izin ver.
ben kurulum şu benim klasör yapısı:
Web sitesi -> Şablonlar -> TemplateFolder
İnternet sitesi (şablon olarak aynı adlandırılır) -> Şablonlar -> UserControls (Kullanıcı denetimleri belirli olmayan bir şablonda saklanan başlamak için
public class Template
{
public string TemplateName { get; set; }
public string UserControlName { get; set; }
public string MasterPageName { get; set; }
public string TemplateFolder
{
get
{
return GetTemplateFolder(TemplateName);
}
}
public string TemplateConfigFile { get { return GetTemplateConfigFile(TemplateName); } }
private static string GetTemplateFolder(string name)
{
return HttpContext.Current.Server.MapPath("~/Templates/" + name + "/");
}
private static string GetTemplateConfigFile(string name)
{
return GetTemplateFolder(name) + "/" + name + ".config";
}
public Template()
{
}
public void Save()
{
XmlSerializer xs = new XmlSerializer(typeof(Template));
if (!Directory.Exists(TemplateFolder)) Directory.CreateDirectory(TemplateFolder);
using (FileStream fs = File.OpenWrite(TemplateConfigFile))
{
xs.Serialize(fs, this);
}
}
public static Template Load(string name)
{
if(!File.Exists(GetTemplateConfigFile(name))) return null;
XmlSerializer xs = new XmlSerializer(typeof(Template));
using (FileStream fs = File.OpenRead(GetTemplateConfigFile(name)))
{
Template t = (Template)xs.Deserialize(fs);
return t;
}
}
}
bazı çıplak xml kodunu inşa edebilirsiniz: klasör)
Bence temel bir şablon deffinition/kaydetme/saklamak yükleyebilirsiniz basit şablon yapılandırma sınıfı tanımlanmış Aşağıdaki kodu çalıştırarak:
Template t1 = new Template() { TemplateName = "Template1", MasterPageName = "Child1.master", UserControlName = "uc1.ascx" };
Template t2 = new Template() { TemplateName = "Template2", MasterPageName = "Child2.master", UserControlName = "uc2.ascx" };
t1.Save();
t2.Save();
Temel bir ana sayfa oluşturdum. Bu sayfa muhtemelen varsayılan sayfanıza temel yer tutucuları vermekten başka hiçbir zaman kullanılmayacaktır. Tüm ana sayfalarınızda, temel sayfanızla aynı yer tutucu grubu olmalıdır; böylece sayfalarınız bunları birbirinin yerine kullanabilir. Dikkat, kullanıcı kontrolümüz için bir yer tutucu bıraktım.
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="BaseMaster.master.cs" Inherits="Templates_Masters_BaseMaster" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ContentPlaceHolder id="cphHeader" runat="server">
</asp:ContentPlaceHolder>
<asp:ContentPlaceHolder id="cpUserControl" runat="server">
</asp:ContentPlaceHolder>
<asp:ContentPlaceHolder id="cphFooter" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>
Şimdi yukarıdaki ana sayfayı kullanan temel bir aspx web sayfası oluşturuyorum.
<%@ Page Title="" Language="C#" MasterPageFile="~/Templates/Masters/BaseMaster.master" AutoEventWireup="true" CodeFile="DefaultTemplated.aspx.cs" Inherits="DefaultTemplated" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="cphHeader" Runat="Server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="cpUserControl" Runat="Server">
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="cphFooter" Runat="Server">
</asp:Content>
Codebehind'de temel şablon oluşturacağız. Bu, ana sayfayı ayarlar ve kullanıcı kontrolleri için içerik yer tutucusuna önceden tanımlanmış bir kullanıcı kontrolü ekler. İsterseniz bir panel ya da bir şey yapıp sabit bir kontrole ekleyebilirdiniz, ancak ana sayfalarla nasıl çalışacağınızı görmekten memnun olabileceğinizi düşündüm.
public partial class DefaultTemplated : System.Web.UI.Page
{
private Template PageTemplate
{
get
{
if (_tLoaded == null)
{
string template = Request.QueryString["template"];
if (string.IsNullOrEmpty(template)) return null;
Template t = Template.Load(template);
_tLoaded = t;
}
return _tLoaded;
}
}
private Template _tLoaded = null;
protected void Page_Load(object sender, EventArgs e)
{
if (PageTemplate != null)
{
//cpUserControl is the name of my usercontrol placeholder
((ContentPlaceHolder)Page.Form.FindControl("cpUserControl")).Controls.Add(
Page.LoadControl("~/Templates/UserControls/" + PageTemplate.UserControlName));
}
}
protected void Page_PreInit(object sender, EventArgs e)
{
if (PageTemplate == null) return;
this.MasterPageFile = "~/Templates/" + PageTemplate.TemplateName + "/" + PageTemplate.MasterPageName;
}
}
siz "Template1" siz "default.aspx? Template = Template1" arayarak kullanabiliriz adında bir şablon olsaydı. URL yeniden yazmayı kullandığınızdan, şablon adını sayfaya parametre olarak iletmek için yeniden yazmayı kullanırdınız.
Yukarıdakilerle birleştirilebilecek başka bir seçenek, Page.ParseControl kullanımı olacaktır. Bunu kullanarak ham asp.net tasarımcı kodunuzu (yalnızca tasarımcı) bir veritabanında veya ham metin dosyasında saklayabilirsiniz. O zaman böyle yüklemek örneğini verebilir: Bu konuda
//where pnl1 is a Panel on the page. Page.ParseControl just returns a control object, so use it anywhere.
pnl1.Controls.Add(Page.ParseControl("raw asp.net designer code here."));
Bir çok şey iç içe kontroller çok büyük çalışmasıdır.
İlginç bir soru ... Geçmişte bu soruyu kendime sordum, ancak bilgi eksikliğim nedeniyle yaklaşımımı hızla değiştirdim. +1 belki de beni aydınlatsın. –
"Arka uç tamamlandı (şimdilik):" Tercihlerinizi zaten arka uçtan dışarı yaparak sınırladığınızdan korkuyorum. Çerçeve tabanlı bir çözüm büyük olasılıkla bir yeniden yazma gerektirecektir. –
@ArtharAnis - Fırsatı bulduğunuzda, cevabım hakkında ne düşündüğünüzü bana bildirin. – Peter