N2CMS主题修复指南

在使用N2CMS进行网站开发时,可能会遇到主题应用不正确的问题,尤其是在论坛插件中。本文将详细说明如何分析并解决这一问题。

问题描述

在最新版本的N2CMS中,当运行论坛插件时,第一页能够正确应用主题,但后续页面却无法正确应用。经过调查,发现问题出在Forum Pages CurrentItem上,它解析为null,导致ThemeConcern无法为页面分配正确的主题。

问题分析

N2.Templates.Web命名空间中的ThemeConcern类中,可以看到如下代码: namespace N2.Templates.Web { /// <summary> /// /// Sets the theme of the page template. /// /// </summary> /// [Service(typeof(TemplateConcern))] public class ThemeConcern : TemplateConcern { public override void OnPreInit(ITemplatePage template) { var item = template.CurrentItem; if (item == null) return; // Implementation doesn't matter here as it will never run! } } } 这段代码中,如果CurrentItemnull,则不会执行任何操作,这就是为什么论坛没有主题的原因。

解决方案

要修复这个问题,需要让论坛页面从起始页面获取主题,同时不影响其他页面类型。幸运的是,YAF框架提供了一个扩展点,可以使用它来修复这个问题:yaf.IUrlBuilder。这是一个简单的接口,它接受查询字符串参数并返回相应的链接。

以下是N2UrlLinkBuilder类的实现: using System.Web; namespace N2.Templates.Forum { /// <summary> /// /// Build links from the current page /// /// </summary> /// public class N2UrlLinkBuilder : yaf.IUrlBuilder { #region IUrlBuilder Members /// <summary> /// /// Builds the URL. /// /// </summary> /// /// <param name="url"> /// /// The URL. /// /// </param> /// /// <returns> /// /// </returns> /// public string BuildUrl(string url) { return string.Format("{0}?{1}", HttpContext.Current.Request.RawUrl.Split('?')[0], url); } #endregion } }

不幸的是,YAF不允许通过配置设置链接构建器,它必须通过编程方式完成。因此,需要修改/Forum/UI/Views/Forum.aspx以确保它被设置: namespace N2.Templates.Forum.UI.Views { public partial class Forum : N2.Templates.Web.UI.TemplatePage { protected override void OnPreInit(EventArgs e) { if (! (yaf.Config.IsRainbow || yaf.Config.IsDotNetNuke || yaf.Config.IsPortal || yaf.Config.EnableURLRewriting == "true")) { HttpContext.Current.Application["yaf_UrlBuilder"] = new N2UrlLinkBuilder(); } base.OnPreInit(e); } } }

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485