6

異なるドメインで複数のストアをサポートする e コマース プラットフォームに取り組んでいます。バックエンドは(今のところ)完成しており、フロントエンド部分を開始しています。プラットフォームは複数のストアをサポートしているため、ある種のテンプレート システムが必要ですが、これを行う最善の方法が何であるかがよくわかりません。

これは私の要件です:

  • 新しいテンプレートを追加するためにソリューションを再構築したくない
  • テンプレートは /Templates/TemplateDirectoryName に保存されます
  • テンプレート内で (定義済みの) ユーザー コントロールを使用できるようにしたいと考えています。
  • URL ルーティングを使用しており、どのページ テンプレートと追加のコードを読み込む必要があるかを制御する Default.aspx ページが 1 つしかありません。

これは私がこれまでに思いついたものです:

  • 私のテンプレートディレクトリには、マスターページで作成されたテンプレートがあります(ホームページマスターファイル、デフォルトマスターファイル、およびデフォルトマスターファイルを参照するサブマスターファイル...製品の詳細、参照、検索など)
  • 私の Default.aspx ページは、ルーティング値に基づいて適切なテンプレートを選択します

この方法は機能しますが、あまり実用的ではないと思いますが、考えれば考えるほど、これを回避する他の選択肢はそれほど多くないという結論に達します。これが私が聞きたいことだと思います: テンプレートでユーザー コントロールを使用し、テンプレートをアプリケーションから完全に分離して、ユーザーがサイトの名前空間と構造を気にせずにテンプレートを作成できるようにする方法はありますか?

敬具、マーク

4

3 に答える 3

2

テンプレートのフォルダーを参照しているので、フォルダー内の .aspx ファイルを変更するだけで、asp.net はあなたが言及した URL パスに基づいてテンプレートを取得することはできませんか? それはasp.netで可能だと思います。
また、DotNetNuke、Sharepoint、Joomla などのフレームワークにも同様の概念があります。それらの機能を利用できます。

于 2012-07-17T10:04:28.590 に答える
1

私が提案する解決策は以下のとおりです。すべてのマスター ページが同じプレースホルダー コントロールのセットを実装する必要があるなど、いくつかの制約があります (驚くべきことではありません)。見て、あなたの考えを教えてください。

フォルダー構造を次のようにセットアップします。

Web サイト -> Templates -> TemplateFolder (テンプレートと同じ名前)
Web サイト -> Templates -> UserControls (ユーザー コントロールはテンプレート固有でないフォルダーに格納されます)

基本的なテンプレート定義を保存/保存/ロードできる単純な Template 構成クラスを定義しました。

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 Web ページを作成します。

<%@ 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?template=Template1」を呼び出して使用できます。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."));

これの素晴らしい点の 1 つは、ネストされたコントロールもうまく機能することです。

于 2012-07-17T18:17:48.747 に答える
0

正しく理解しているかどうかわかりません:

再構築したくない場合は、CMS のコンセプトが最も適していると言えます。

  • テンプレートを HTML としてデータベースに保存し、DB から取得して戻すことができます。
  • テンプレートをオンラインで編集するためのエディターを備えた管理者機能を提供することもできます。
于 2012-07-17T09:57:03.243 に答える