Интеграция проекта Webforms с Composite C1 - PullRequest
4 голосов
/ 31 октября 2011

Мы разработали ASP.Net Webforms Application, своего рода интернет-магазин.Некоторые страницы содержат только редакционный контент, новости, статьи и т. Д. Это содержимое поступает из базы данных прямо сейчас, и его сложно редактировать для авторов контента.

Мой начальник хочет, чтобы я проверил, можем ли мы использовать Composite C1как CMS и интегрировать его с Проектом.

Я изучил это сейчас и поиграл с ним в течение нескольких дней, но я все еще не уверен, хорошая ли это идея и как именно я бы интегрировалдве системы.

  • Меню навигации и некоторые другие постоянные части веб-сайта взяты из базы данных и должны отображаться на страницах редакции.
  • Мы используем SEO дружественныеURL-адреса (маршрутизация) и URL-адреса должны оставаться одинаковыми.

Насколько сложно будет объединить два проекта?Должен ли я отказаться от старого проекта веб-сайта ASP.Net и поместить все свои сайты в проект Composite?Или можно будет запускать обе стороны рядом, даже если у них есть общие навигационные меню и т. Д.?

Будет ли проблема с маршрутизацией?

Кто-нибудь делал такое слияние раньше?Любой опыт будет большой помощью.

1 Ответ

5 голосов
/ 01 ноября 2011

C1 использует Webforms для размещения своего контента, поэтому вы ничего не можете сделать, что вы делаете сейчас в своем проекте Webforms.Вы можете использовать Webforms Masterpages в качестве шаблонов для своего контента, и маршрутизация полностью поддерживается, либо путем добавления столько пользовательских маршрутов, сколько вы хотите, либо просто переопределяя маршрут по умолчанию на странице c1.Или полагаясь на PathInfo Api , где непревзойденные части URL-адреса будут доступны для использования на странице, которая соответствует максимально длинной части URL-адреса.Вы также можете использовать Razor (.cshtml) в C1, если вам нравится этот новый синтаксис от Microsoft.

Вы также можете изменить ситуацию и выбрать визуализацию контента из 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);
    }
}
.
...