将 Webforms 项目与 Composite C1 集成
Posted
技术标签:
【中文标题】将 Webforms 项目与 Composite C1 集成【英文标题】:Integrating a Webforms Project with Composite C1 【发布时间】:2011-12-18 19:18:02 【问题描述】:我们开发了一个 ASP.Net Webforms 应用程序,某种网上商店。有些页面只有编辑内容、新闻、文章等。这些内容现在来自数据库,内容作者很难编辑。
我的老板要我检查我们是否可以将 Composite C1 用作 CMS 并将其与项目集成。
我现在已经对其进行了研究并使用了几天,但我仍然不确定这是否是一个好主意以及我将如何整合这两个系统。
网站的导航菜单和其他一些永久性部分是从数据库中提取的,并且也必须显示在编辑页面上。 我们使用 SEO 友好的 URL(路由),并且 URL 必须保持不变。合并这两个项目会有多复杂?我是否必须放弃旧的 ASP.Net 网站项目并将我的所有网站都放入 Composite 项目中?还是可以并排运行,即使它们共享导航菜单等?
路由会有问题吗?
以前有人做过这种合并吗?任何经验都会有很大帮助。
【问题讨论】:
您可以将现有功能作为 UserControls 运行吗? 我不确定,很多东西已经在控件中,但也有应用程序范围的缓存、路由(将变量传递到页面)等)我可以让它工作吗以某种方式在 Composite 中? 我担心如果我将整个项目切换到 Composite,我会失去很多 Webforms 项目的灵活性。这不合理吗?我可以在 C1 项目中做我现在在 ASP.Net 网站项目中所做的所有事情吗? 【参考方案1】:C1 正在使用 Webforms 来托管其内容,因此在您的 Webforms 项目中没有什么是您不能做的。您可以使用Webforms Masterpages 作为您的内容的模板,并且完全支持路由,可以通过添加任意数量的自定义路由或仅覆盖默认的 c1 页面路由。或者依靠PathInfo Api,其中不匹配的部分网址将可用于匹配网址最长部分的页面。如果您喜欢 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);
【讨论】:
所以基本上你的建议是:把所有的功能都放到控件中,扔掉你的旧项目,用 C1 作为主项目,对吧? 如果不真正了解您的项目,几乎不可能给出具体的具体建议。如果只是因为你只想使用 C1 来管理内容,你也可以选择在你现有的项目中扭转局面,从 C1 渲染内容。您只需要为 C1 设置正确的上下文以查询其数据,然后您就可以将其输出到任何您想要的地方。编辑了我的答案以显示这也很容易。 听起来很有趣,你知道任何关于如何做到这一点的文章/例子吗?以上是关于将 Webforms 项目与 Composite C1 集成的主要内容,如果未能解决你的问题,请参考以下文章
ViewBag 未在混合 Webforms/MVC 项目中声明
如何将 Perl 与 ASP.NET Webforms 集成?
Unity3D与23种设计模式组合模式(Composite)
将 jQuery 用于 AJAX 与 ASP.NET Webforms [关闭]