2012-05-21 77 views
6

我正在開發一個支持不同域的多個商店的電子商務平臺。後端是完整的(現在),我現在開始前端部分。由於該平臺支持多個商店,因此我需要某種模板系統,但我還沒有弄清楚最好的方法是什麼。在asp.net中創建獨立於源代碼的網站模板webforms

這是我的要求:

  • 我不想重建我的解決方案中添加一個新的模板
  • 模板存儲在/模板/ TemplateDirectoryName
  • 我希望能夠使用(預定義的)用戶控件。
  • 我使用URL路由,只有1 Default.aspx頁面,它控制哪些頁面模板和額外的代碼需要加載。

這是我想出了這麼遠:

  • 在我的模板目錄中我有一個與母版頁(主頁主文件,默認的主文件和子主文件引用創建的模板默認的主文件...產品細節,瀏覽,搜索等)
  • 我Default.aspx頁面挑選基於路由權模板值

雖然這樣的工作,我不認爲這是非常實用的但是t他更多地考慮這個問題,我得出的結論是沒有太多其他選擇可以解決這個問題。我想這就是我想問的問題:是否有一種方法可以在模板中使用usercontrols,並將模板與應用程序完全分離,以便用戶可以創建模板而不必擔心網站的名稱空間和結構?

親切的問候, 馬克

+0

有趣的問題......我以前已經問過自己這個問題,但是由於缺乏知識,我很快改變了我的方法。 +1或許可以啓發我。 –

+0

「後端是完整的(現在):」我擔心你已經通過構建後端來限制你的選擇。基於框架的解決方案很可能需要重寫。 –

+0

@ArtharAnis - 當你有機會時,讓我知道你對我的答案的看法。 – Peter

回答

0

我不知道如果我理解正確:

如果您不想重建,那麼我可以告訴一個CMS的概念是最適合你的。

  • 您可以將模板存儲在數據庫中的HTML和DB,你可以把它抓回來,
  • 可以給人以編輯管理員功能,編輯您的模板在線也。
2

既然你引用的模板文件夾,是不是很可能只是更改文件夾和asp.net的.aspx文件系統會根據您所提到的URL路徑上應拿起模板?我認爲這是可能的在asp.net。
此外,像DotNetNuke,Sharepoint,Joomla等框架有類似的概念。你可以利用他們的功能。

1

我建議的解決方案如下。它有一些限制,就像所有母版頁都需要實現相同的佔位符控件集合(並不奇怪)。看一看,讓我知道你的想法。

設置我的文件夾結構是這樣的:

網站 - >模板 - > TemplateFolder(命名爲模板相同)
網站 - >模板 - >用戶控件(用戶控件都存儲在特定的非模板文件夾)

我定義它,我們可以存儲/保存/載入一個基本的模板deffinition一個簡單的模板配置類:

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; 
     } 
    } 
} 

你可以建立一些裸露的XML代碼上手通過運行下面的代碼:

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; 
    } 
} 

如果你有一個名爲「模板」,你可以通過調用「的Default.aspx?模板=模板1」使用模板。由於您正在使用URL重寫,您將使用重寫將模板名稱作爲參數傳遞給頁面。

另一種可以與上述結合使用的方法是使用Page.ParseControl。使用這個,你可以將原始的asp.net設計器代碼(僅限設計者)存儲在數據庫或原始文本文件中。然後,你可以將它實例化加載這樣的:這個

//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.")); 

一個偉大的事情是,嵌套的控制工作的偉大了。

相關問題