2012-05-21 17 views
6

Farklı etki alanlarındaki birden çok mağazayı destekleyen bir e-ticaret platformunda çalışıyorum. Arka uç tamamlandı (şimdilik) ve şimdi ön uç kısmına başlıyorum. Platform birden fazla mağazayı desteklediğinden, bir çeşit şablon sistemine ihtiyacım var ve bunu yapmanın en iyi yolunun ne olduğunu tam olarak anlayamadım.Web sitesi şablonu asp.net webforms kaynak kodundan bağımsız olarak oluşturuluyor

Bu benim gereksinimleri şunlardır:

  • Ben
  • Şablonları Kullanmak mümkün istiyorum/Şablonlar/TemplateDirectoryName
  • saklanır yeni şablon eklemek için benim çözüm yeniden istemiyoruz Şablonların içinde (önceden tanımlanmış) usercontrols.
  • URL yönlendirmesini kullanıyorum ve yalnızca hangi sayfa şablonunun ve ek kodun yüklenmesi gerektiğini kontrol eden 1 Default.aspx sayfasına sahibim.

Bu şimdiye kadar geldi budur: Benim şablon dizininde

  • i başvuran ana sayfalar (A anasayfa ana dosya, varsayılan bir ana dosya ve alt ana dosyaları ile oluşturulan şablonlar var varsayılan ana dosya ... ürün detay için, bu şekilde işe yararken Ben çok pratik olduğunu sanmıyorum

değerleri

  • Benim default.aspx sayfasında yönlendirme dayalı doğru şablonu seçer) vb arama göz ama t daha fazla düşünürken, bu konuda daha fazla seçeneğin olmadığı sonucuna varıyorum. Bunu sormak istediğimi düşünüyorum: Bir şablonda usercontrols kullanmanın ve şablonun uygulamadan tamamen ayrılmasının bir yolu var mıdır, böylece kullanıcılar sitenin ad alanı ve yapısı hakkında endişelenmeden şablonlar oluşturabilirler mi?

    Saygılarımızla Mark

  • +0

    İ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. –

    +0

    "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. –

    +0

    @ArtharAnis - Fırsatı bulduğunuzda, cevabım hakkında ne düşündüğünüzü bana bildirin. – Peter

    cevap

    0

    eğer doğru anlamak bilmiyorum:

    yeniden oluşturmak istemiyorsanız, o zaman CMS kavramı sizin için en uygun olduğunu söyleyebilirim.

    • Online ayrıca şablonu düzenlemek için editör ile bir yönetici işlevselliği verebilir, Sen veritabanında bir HTML olarak şablonları saklayabilir ve DB'den onu geri getirebilir.
    2

    Şablonlar için bir klasöre başvuru yaptığınız için, klasördeki .aspx dosyalarını değiştirmek mümkün olmazdı ve asp.net, belirttiğiniz URL yolunu temel alarak şablonu alır. ? Asp.net'de bunun mümkün olduğunu düşünüyorum.
    Ayrıca, DotNetNuke, Sharepoint, Joomla vb. Gibi çerçeveler de benzer bir konsepte sahiptir. Onların özelliklerini kullanabilirsin.

    1

    Ö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.

    İlgili konular