在使用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!
}
}
}
这段代码中,如果CurrentItem
为null
,则不会执行任何操作,这就是为什么论坛没有主题的原因。
要修复这个问题,需要让论坛页面从起始页面获取主题,同时不影响其他页面类型。幸运的是,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