我们开始一个新的项目,使用sitecore作为我们的CMS。我正在考虑使用Sitecore作为内容创作工具,并使用ASP.net MVC在内容交付(CDA)方面与Sitecore。很愿意听到你的想法和想法。
有没有人试过这个?
是sitecore和MVC竞争还是补充技术?
欢迎任何建筑理念。
解决方法
对于某些情况,合并两者可能有巨大的好处。 MVC不适合内容驱动的网站。然而,具有结构化流和多个数据呈现的web应用程序从中获益良多。当涉及多个数据表示时,Sitecore有一些限制 – 您只能在一个项目上定义一组设计详细信息。如果您没有对所见即所得编辑或简单的一键预览的要求,则可以使用Sitecore作为数据存储库,并利用来自其管道的一些Context值(如语言)。
需要对Sitecore HTTP管道进行几项修改才能使此工作:
1)如果使用IIS6中的aspx扩展来获取ASP.NET处理MVC请求(例如/Controller.aspx/Action),修复Sitecore的FilePath解析(有一个错误,Sitecore如何解析FilePath,这将导致路径得到切碎的)。
要解决这个问题,请在httpRequestBegin管道的开头放置一个新的处理器。
public class MvcFixHttpProcessor : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor { public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args) { //when using a path such as /Controller.aspx/Blahblahblah,Sitecore's parsing of FilePath can break if Blahblahblah is too long RouteData routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(args.Context)); if (routeData != null) { args.Url.FilePath = args.Context.Request.Url.LocalPath; } } }
(编辑9/13/2011:我有一段时间没有使用上面的修复)。
2)告诉Sitecore忽略路由到ASP.NET MVC的URL
要完成此操作,请在ItemResolver后的httpRequestBegin管道中放置一个新处理器。
public class SystemWebRoutingResolver : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor { public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args) { RouteData routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(args.Context)); if (routeData != null) { args.AbortPipeline(); } } }
如果您在Sitecore网址中使用语言,则需要添加一些自定义逻辑,将Sitecore链接生成与MVC ActionLink生成相结合,以确保语言添加到MVC网址的开头。然而,对于上面的管道修改,向URL添加语言应该没有对MVC路由的副作用(因为Sitecore在读取语言之后重写URL)。
再次,此方法仅对某些类型的应用程序有用。在这些情况下,Sitecore为您的模型提供了一个很好的数据层。查看创建自定义项包装器以基于Sitecore项目创建强类型域对象。
(编辑9/13/2011:自定义项目生成器非常适合这个http://blog.velir.com/index.php/2010/10/19/custom-item-generator/)
最好的运气。