Orchardcms 将动态内容注入Orchard页面正文

Orchardcms 将动态内容注入Orchard页面正文,orchardcms,orchardcms-1.6,Orchardcms,Orchardcms 1.6,是否可以将动态内容注入Orchard页面正文?我想将当前登录用户的id插入到链接中 我最初的想法是使用令牌替换,因此在运行时输入将[memberid]替换为登录的用户id。在将响应发送回客户端之前,是否有办法截获响应并运行一些自定义代码 都是一样的,但是答案是非常具体的。代币可能是正确的方式,但是我还没有深入探讨。但是,如果要更改响应,可以使用响应过滤器 我用它来缩小这个模块中生成的HTML 下面是一些代码,这些代码应该能起到作用,或者至少能给你一个想法 using System.Globali

是否可以将动态内容注入Orchard页面正文?我想将当前登录用户的id插入到链接中

我最初的想法是使用令牌替换,因此在运行时输入
将[memberid]替换为登录的用户id。在将响应发送回客户端之前,是否有办法截获响应并运行一些自定义代码


都是一样的,但是答案是非常具体的。

代币可能是正确的方式,但是我还没有深入探讨。但是,如果要更改响应,可以使用响应过滤器

我用它来缩小这个模块中生成的HTML

下面是一些代码,这些代码应该能起到作用,或者至少能给你一个想法

using System.Globalization;
using System.IO;
using System.Text;
using System.Web.Mvc;
using Orchard;
using Orchard.Mvc.Filters;
using Orchard.UI.Admin;

public class TokenReplacementFilter : FilterProvider, IActionFilter
{
    private readonly WorkContext _workContext;

    public TokenReplacementFilter(IWorkContextAccessor workContextAccessor)
    {
        _workContext = workContextAccessor.GetContext();
    }

    public void OnActionExecuting(ActionExecutingContext filterContext) {
        // Only apply the token replacement if logged in and not in the Orchard admin area
        if (filterContext.HttpContext.Response.Filter == null || _workContext.CurrentUser == null || AdminFilter.IsApplied(filterContext.RequestContext))
            return;

        filterContext.HttpContext.Response.Filter = new TokenReplacementStream(filterContext.HttpContext.Response.Filter, filterContext.HttpContext.Response.Output.Encoding, _workContext);
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }
}

internal class TokenReplacementStream : MemoryStream
{
    private readonly Stream _stream;
    private readonly Encoding _encoding;
    private string _html;
    private readonly WorkContext _workContext;

    public TokenReplacementStream(Stream filter, Encoding encoding, WorkContext workContext)
    {
        _stream = filter;
        _encoding = encoding;
        _workContext = workContext;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        _html += _encoding.GetString(buffer);
    }

    public override void Flush()
    {
        if (_html != null) {
            _html = _html.Replace("[memberid]", _workContext.CurrentUser.Id.ToString(CultureInfo.InvariantCulture));
            _stream.Write(_encoding.GetBytes(_html), 0, _encoding.GetByteCount(_html));   
        }
    }
}

谢谢你的回答,让我试一试,但是我得到了一个HttpException,它有一条毫无帮助的消息“过滤是不允许的”,错误代码是2147467259。但是,它仍然会命中过滤器中Flush方法中的代码。我在OnActionExecuting中添加了一个空检查,你能试试吗?此外,如果您在调试模式下运行,请尝试禁用它(如果有帮助的话)。空检查成功了。我还必须不应用过滤器,如果在管理网站,因为这是取代我的令牌!有一个编译错误,因为WorkContext在1个区域中不可访问,我已经修复了这个问题,并做了一些命名更改,以更好地适应我的项目。我已经编辑了一篇文章,但上面说需要“同行评审”,一旦完成,我会将这个答案标记为接受。由于某种原因,编辑被拒绝,它说“这个编辑不正确,或者试图回复或评论现有帖子。”。然而,我遇到了一个问题,当我注销网站时,它会出错,只是现在查看它。这个错误与其他一些代码有关,与此无关。我对代码做了一些改进,以消除我遇到的一些bug,但如上所述,当我试图编辑它时,它总是被拒绝。我不想自己发布答案并接受这一点,因为这是你应得的荣誉。我可以把它贴在一个答案里,这样你就可以复制粘贴它,然后我就可以删除答案了,你觉得呢?