#c# #asp.net #webforms #integration #c1-cms
#c# #asp.net #веб-формы #интеграция #c1-cms
Вопрос:
Мы разработали ASP.Net Приложение Webforms, что-то вроде интернет-магазина. На некоторых страницах есть только редакционный контент, новости, статьи и т. Д. Это содержимое поступает из базы данных прямо сейчас, и его трудно редактировать для авторов контента.
Мой босс хочет, чтобы я проверил, можем ли мы использовать Composite C1 в качестве CMS и интегрировать его с проектом.
Я изучил его сейчас и играл с ним уже несколько дней, но я все еще не уверен, хорошая ли это идея и как именно я бы интегрировал две системы.
- Меню навигации и некоторые другие постоянные части веб-сайта берутся из базы данных и также должны отображаться на страницах редакции.
- Мы используем оптимизированные для SEO URL-адреса (маршрутизация), и URL-адреса должны оставаться неизменными.
Насколько сложным будет объединение двух проектов? Должен ли я отказаться от старого ASP.Net Проект веб-сайта и поместить все мои сайты в Составной проект? Или можно будет запускать оба проекта параллельно, даже если у них есть общие меню навигации и т. Д.?
Будет ли проблемой маршрутизация?
Кто-нибудь раньше делал такое слияние? Любой опыт был бы большим подспорьем.
Комментарии:
1. можете ли вы вместо этого запустить существующую функциональность как UserControls?
2. Я не уверен, многие вещи уже находятся в элементах управления, но есть также такие вещи, как кэширование в масштабах всего приложения, маршрутизация (с переменными, передаваемыми на страницы) и т. Д.) Смогу ли я заставить это как-то работать в Composite?
3. Я обеспокоен тем, что я потеряю большую часть гибкости, которую я имею с проектом Webforms, если я переключу весь свой проект на Composite. Это неразумно? Могу ли я сделать в проекте C1 все, что я делаю сейчас в своем ASP.Net Проект веб-сайта?
Ответ №1:
C1 использует Webforms для размещения своего содержимого, поэтому нет ничего, что вы не могли бы сделать, что вы делаете сейчас в своем проекте webforms. Вы можете использовать мастер-страницы Webforms в качестве шаблонов для своего контента, и маршрутизация полностью поддерживается, либо путем добавления столько пользовательских маршрутов, сколько вы хотите, либо просто переопределяя маршрут страницы c1 по умолчанию. Или полагаться на Api PathInfo, где несопоставимые части 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);
}
}
Комментарии:
1. Итак, в основном ваш совет был бы таков: поместите всю функциональность в элементы управления, выбросьте свой старый проект и используйте C1 в качестве основного проекта, верно?
2. не зная ничего о вашем проекте, практически невозможно дать конкретный конкретный совет. Если это связано с тем, что вы просто хотите использовать C1 для управления контентом, вы также можете изменить ситуацию и отобразить контент из C1 в вашем существующем проекте. Все, что вам нужно, это настроить правильный контекст для C1 для запроса его данных, и вы сможете выводить его куда угодно. Отредактировал мой ответ, чтобы показать, насколько это просто.
3. Звучит интересно, знаете ли вы какие-нибудь статьи / примеры о том, как именно это сделать?