मेरा प्रस्तावित समाधान नीचे है। इसमें कुछ बाधाएं हैं, जैसे सभी मास्टर पेजों को प्लेसहोल्डर नियंत्रण के समान सेट को लागू करने की आवश्यकता है (आश्चर्य की बात नहीं है)। एक नज़र डालें और मुझे बताएं कि आप क्या सोचते हैं।
मैं सेटअप इस तरह मेरी फ़ोल्डर संरचना:
वेबसाइट -> टेम्पलेट -> TemplateFolder
वेबसाइट (टेम्पलेट के रूप में एक ही नाम) -> टेम्पलेट्स -> UserControls (उपयोगकर्ता नियंत्रण एक गैर टेम्पलेट विशिष्ट में जमा हो जाती
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;
}
}
}
आप कुछ नंगे एक्सएमएल कोड का निर्माण कर सकते आरंभ करने के लिए: फ़ोल्डर)
मैं एक साधारण खाका विन्यास वर्ग है जो हम स्टोर कर सकते हैं/बचाने/लोड एक बुनियादी टेम्पलेट deffinition परिभाषित नीचे दिए गए कोड को चलाकर:
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();
मैंने एक मूल मास्टर पेज बनाया है। यह पृष्ठ शायद आपके डिफ़ॉल्ट पृष्ठ को मूल प्लेसहोल्डर देने के अलावा कभी भी उपयोग नहीं किया जाएगा। आपके सभी मास्टर पृष्ठों में प्लेसहोल्डर्स का एक ही सेट आपके आधार के रूप में होना चाहिए ताकि आपके पृष्ठ उन सभी को एक दूसरे के रूप में उपयोग कर सकें। नोटिस मैंने अपने उपयोगकर्ता नियंत्रण के लिए प्लेसहोल्डर छोड़ा।
<%@ 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>
अब मैं एक बुनियादी aspx वेब पेज के ऊपर मास्टर पृष्ठ का उपयोग करता है बनाएँ।
<%@ 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>
कोडबेंड में हम बुनियादी टेम्पलेटिंग सेट करेंगे। यह मास्टरपेज सेट करता है और उपयोगकर्ता नियंत्रण के लिए सामग्री प्लेसहोल्डर को पूर्व परिभाषित उपयोगकर्ता नियंत्रण जोड़ता है। यदि आप चाहते थे कि आप केवल एक पैनल या कुछ बना सकें और इसे उस निश्चित नियंत्रण में जोड़ सकें, लेकिन मैंने सोचा कि आप यह देखकर सराहना कर सकते हैं कि इसे मास्टरपेज के साथ कैसे काम करना है।
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;
}
}
आप "Template1" आप को "Default.aspx? टेम्पलेट = Template1" द्वारा इसका इस्तेमाल कर सकते नामक एक टेम्पलेट था। चूंकि आप यूआरएल रीराइटिंग का उपयोग कर रहे हैं, इसलिए आप पृष्ठ पर पैरामीटर के रूप में टेम्पलेट नाम को पास करने के लिए पुनः लिखने का उपयोग करेंगे।
उपरोक्त के साथ संयुक्त किया जा सकता है एक और विकल्प पेज.पर्स कंट्रोल का उपयोग होगा। इसका उपयोग करके आप डेटाबेस या कच्ची टेक्स्ट फ़ाइल में अपने कच्चे एएसपीनेट डिजाइनर कोड (केवल डिजाइनर) को स्टोर कर सकते हैं। तो फिर तुम इसे इस तरह इसे लोड का दृष्टांत सकता है: इस बारे में
//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."));
एक बड़ी बात यह है कि नेस्टेड नियंत्रण भी महान काम करते हैं।
दिलचस्प सवाल ... मैंने पहले से ही इस सवाल को अपने आप से पहले ही पूछा था, लेकिन ज्ञान की कमी के कारण मैंने जल्दी ही अपना दृष्टिकोण बदल दिया। शायद मुझे प्रबुद्ध करने के लिए +1। –
"बैकएंड पूरा हो गया है (अभी के लिए):" मुझे डर है कि आपने पहले से ही पीछे के अंत का निर्माण करके अपने विकल्पों को सीमित कर दिया है। एक ढांचा-आधारित समाधान सबसे अधिक संभावना एक पुनर्लेखन में शामिल होगा। –
@ आर्थरएनिस - जब आपको मौका मिलता है तो मुझे बताएं कि आप मेरे उत्तर के बारे में क्या सोचते हैं। – Peter