2012-05-21 10 views
6

में स्रोत कोड से स्वतंत्र है, मैं एक ई-कॉमर्स मंच पर काम कर रहा हूं जो विभिन्न डोमेन पर एकाधिक स्टोर का समर्थन करता है। बैकएंड पूरा हो गया है (अभी के लिए) और अब मैं फ्रंट एंड भाग शुरू कर रहा हूं। चूंकि मंच कई स्टोर्स का समर्थन करता है, इसलिए मुझे किसी प्रकार की टेम्पलेटिंग सिस्टम की आवश्यकता है और मुझे यह पता नहीं लगा है कि ऐसा करने का सबसे अच्छा तरीका क्या है।वेबसाइट टेम्पलेट बनाना जो एएसपीनेट वेबफॉर्म

यह मेरा आवश्यकताएँ हैं:

  • मैं
  • टेम्पलेट्स/टेम्पलेट्स/TemplateDirectoryName
  • में जमा हो जाती मैं उपयोग करने में सक्षम होना चाहता हूँ एक नया टेम्पलेट जोड़ने के लिए मेरी समाधान के पुनर्निर्माण के लिए नहीं करना चाहते हैं (पूर्वनिर्धारित) टेम्पलेट्स के अंदर usercontrols।
  • मैं यूआरएल रूटिंग का उपयोग करता हूं और केवल 1 Default.aspx पृष्ठ है जो नियंत्रित करता है कि कौन सा पेज टेम्पलेट और अतिरिक्त कोड लोड किया जाना चाहिए।

यह वही है मैं अब तक के साथ आया है:

  • मेरे टेम्पलेट निर्देशिका में मैं मास्टर पेजेस (ए होमपेज पर मास्टर फ़ाइल, एक डिफ़ॉल्ट मास्टर फ़ाइल, और उप मास्टर फ़ाइलों को संदर्भित के साथ बनाया टेम्पलेट्स डिफ़ॉल्ट मास्टर फ़ाइल ... उत्पाद विस्तार के लिए, ब्राउज़, खोज आदि)
  • मेरे Default.aspx पेज मार्ग के आधार पर सही टेम्पलेट उठाता महत्व देता

इस तरह से काम करता है मैं इसे बहुत ही व्यावहारिक है नहीं लगता है लेकिन टी जितना अधिक मैं इसके बारे में सोचता हूं उतना ही मैं इस निष्कर्ष पर आता हूं कि इस के आसपास जाने के लिए कई अन्य विकल्प नहीं हैं। मुझे लगता है कि मैं यही पूछना चाहता हूं: क्या टेम्पलेट में उपयोगकर्ता नियंत्रण का उपयोग करने का कोई तरीका है और टेम्पलेट को पूरी तरह से एप्लिकेशन से अलग किया गया है ताकि उपयोगकर्ता साइट के नामस्थान और संरचना के बारे में चिंता किए बिना टेम्पलेट बना सकें?

सधन्यवाद, मार्क

+0

दिलचस्प सवाल ... मैंने पहले से ही इस सवाल को अपने आप से पहले ही पूछा था, लेकिन ज्ञान की कमी के कारण मैंने जल्दी ही अपना दृष्टिकोण बदल दिया। शायद मुझे प्रबुद्ध करने के लिए +1। –

+0

"बैकएंड पूरा हो गया है (अभी के लिए):" मुझे डर है कि आपने पहले से ही पीछे के अंत का निर्माण करके अपने विकल्पों को सीमित कर दिया है। एक ढांचा-आधारित समाधान सबसे अधिक संभावना एक पुनर्लेखन में शामिल होगा। –

+0

@ आर्थरएनिस - जब आपको मौका मिलता है तो मुझे बताएं कि आप मेरे उत्तर के बारे में क्या सोचते हैं। – Peter

उत्तर

0

मैं अगर मैं सही ढंग से समझ नहीं जानता:

आप के पुनर्निर्माण के लिए नहीं करना चाहते हैं, तो मैं बता सकता है एक सीएमएस अवधारणा आप के लिए सबसे उपयुक्त है।

  • आप डेटाबेस में एक HTML के रूप में अपने टेम्पलेट्स स्टोर कर सकते हैं और डीबी से आप इसे वापस लाने के कर सकते हैं,
  • आप संपादक के साथ एक व्यवस्थापक कार्यक्षमता अपने टेम्पलेट को संपादित करने भी ऑनलाइन दे सकते हैं।
2

जब से तुम टेम्पलेट्स के लिए एक फ़ोल्डर संदर्भित कर रहे हैं, नहीं यह सिर्फ फ़ोल्डर और asp.net में .aspx फ़ाइलों को बदलने के लिए यूआरएल रास्ता है कि आप का उल्लेख किया है, उसके आधार टेम्पलेट लेने जाएगा संभव होगा ? मुझे लगता है कि एएसपीनेट में संभव है।
इसके अलावा, डॉटनेटनेट, शेयरपॉइंट, जूमला इत्यादि जैसे फ्रेमवर्क समान अवधारणा रखते हैं। आप उनकी विशेषताओं का लाभ उठा सकते हैं।

1

मेरा प्रस्तावित समाधान नीचे है। इसमें कुछ बाधाएं हैं, जैसे सभी मास्टर पेजों को प्लेसहोल्डर नियंत्रण के समान सेट को लागू करने की आवश्यकता है (आश्चर्य की बात नहीं है)। एक नज़र डालें और मुझे बताएं कि आप क्या सोचते हैं।

मैं सेटअप इस तरह मेरी फ़ोल्डर संरचना:

वेबसाइट -> टेम्पलेट -> 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.")); 

एक बड़ी बात यह है कि नेस्टेड नियंत्रण भी महान काम करते हैं।

संबंधित मुद्दे