4

ある種の Web ショップである ASP.Net Webforms アプリケーションを開発しました。一部のページには編集コンテンツ、ニュース、記事などしかありません。これらのコンテンツは現在データベースから取得されており、コンテンツ ライターが編集するのは困難です。

上司は、Composite C1 を CMS として使用し、それをプロジェクトに統合できるかどうかを確認するように求めています。

私は今それを調べて、数日間試してみましたが、それが良いアイデアであるかどうか、そして2つのシステムをどのように正確に統合するかはまだわかりません.

  • ウェブサイトのナビゲーション メニューやその他の永続的な部分は、データベースから取得され、編集ページにも表示する必要があります。
  • SEO に適した URL (ルーティング) を使用しており、URL は同じままである必要があります。

2 つのプロジェクトをマージするのはどのくらい複雑ですか? 古い ASP.Net Website Project をあきらめて、すべてのサイトを Composite プロジェクトに入れる必要がありますか? それとも、ナビゲーションメニューなどを共有しているにもかかわらず、両方を並べて実行することは可能ですか?

ルーティングは問題になりますか?

誰もこの種のマージを以前に行ったことがありますか? どんな経験も大きな助けになります。

4

1 に答える 1

5

C1 は Webforms を使用してそのコンテンツをホストしているため、Webforms プロジェクト内で現在行っていることでできないことはありません。コンテンツのテンプレートとしてWebforms Masterpagesを使用できます。ルーティングは、必要な数のカスタム ルートを追加するか、デフォルトの c1 ページ ルートをオーバーライドすることで完全にサポートされます。または、 PathInfo Apiに依存して、URL の一致しない部分を、URL の可能な限り長い部分に一致するページで使用できるようにします。Microsoft の新しい構文が気に入った場合は、C1 でRazor (.cshtml)を使用することもできます。

状況を好転させて、C1 からのコンテンツを独自の既存のページにレンダリングすることを選択することもできます。このコードは、標準の WebForm .aspx ページを使用して、C1 の特定のページからコンテンツをレンダリングする方法を示しています。

public class BaseContentTeaserPage : Page
{
    private Guid _pageId;

    protected PlaceHolder plc;

    protected override void OnPreInit(EventArgs e)
    {
        _pageId = Guid.Parse(Request.QueryString["pageId"]);

        using (new DataScope(PublicationScope.Published, new CultureInfo("en-GB")))
        {
            using (var data = new DataConnection())
            {
                PageRenderer.CurrentPage = data.Get<IPage>().Single(p => p.Id == _pageId);

                var urlData = new PageUrlData(PageRenderer.CurrentPage);
                urlData.PathInfo = Request.QueryString["pathInfo"];

                Context.Items["C1_PageUrl"] = urlData;
            }
        }

        base.OnPreInit(e);
    }

    protected override void OnLoad(EventArgs e)
    {
        using (new DataScope(PublicationScope.Published, new CultureInfo("en-GB")))
        {
            var content = DataFacade.GetData<IPagePlaceholderContent>().Single(p => p.PageId == _pageId);

            var helper = new PageRendererHelper();
            var mapper = (IXElementToControlMapper)helper.FunctionContext.XEmbedableMapper;
            var doc = helper.RenderDocument(content);
            var body = PageRendererHelper.GetDocumentPart(doc, "body");

            addNodesAsControls(body.Nodes(), plc, mapper);

            if (Page.Header != null)
            {
                var head = PageRendererHelper.GetDocumentPart(doc, "head");
                if (head != null)
                {
                    addNodesAsControls(head.Nodes(), Page.Header, mapper);
                }
            }
        }

        base.OnLoad(e);
    }

    private static void addNodesAsControls(IEnumerable<XNode> nodes, Control parent, IXElementToControlMapper mapper)
    {
        foreach (var node in nodes)
        {
            var c = node.AsAspNetControl(mapper);
            parent.Controls.Add(c);
        }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        var markupBuilder = new StringBuilder();
        using (var sw = new StringWriter(markupBuilder))
        {
            base.Render(new HtmlTextWriter(sw));
        }

        string xhtml = markupBuilder.ToString();

        using (Profiler.Measure("Changing 'internal' page urls to 'public'"))
        {
            xhtml = PageUrlHelper.ChangeRenderingPageUrlsToPublic(xhtml);
        }

        using (Profiler.Measure("Changing 'internal' media urls to 'public'"))
        {
            xhtml = MediaUrlHelper.ChangeInternalMediaUrlsToPublic(xhtml);
        }

        writer.Write(xhtml);
    }
}
于 2011-10-31T22:05:21.613 に答える