使用Composite C1集成Webforms项目

本文关键字:Webforms 项目 集成 C1 Composite 使用 | 更新日期: 2023-09-27 18:12:57

我们开发了一个ASP。Net Webforms应用程序,某种网络商店。有些页面只有编辑内容、新闻、文章等。这些内容现在来自数据库,对于内容编写者来说很难编辑。

我的老板想让我检查一下我们是否可以使用Composite C1作为CMS并将其集成到项目中。

我现在已经研究过了,并且已经玩了几天了,但我仍然不确定这是否是一个好主意,以及我将如何准确地整合这两个系统。

  • 导航菜单和网站的一些其他永久性部分是从数据库绘制的,必须在编辑页面上显示。
  • 我们使用SEO友好的url(路由)和url必须保持不变。

合并这两个项目有多复杂?我将不得不放弃旧的ASP。Net网站项目,并把我所有的网站到复合项目?或者有可能并排运行,即使他们有共享的导航菜单等?

路由会是一个问题吗?

以前有人做过这种合并吗?任何经验都会大有帮助。

使用Composite C1集成Webforms项目

C1使用Webforms来托管它的内容,所以没有什么是你不能做的,你现在在你的Webforms项目中做的。您可以使用Webforms Masterpages作为内容的模板,并且完全支持路由,可以通过添加任意多的自定义路由,也可以覆盖默认的c1页面路由。或者依赖于PathInfo Api,其中url的不匹配部分将可以在匹配url最长部分的页面上使用。如果你喜欢微软的新语法,你也可以在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);
    }
}