簡體   English   中英

將動態內容注入到Orchard頁面主體中

[英]Injecting dynamic content into an Orchard page body

是否可以將動態內容注入到Orchard頁面主體中? 我想將當前登錄用戶的ID注入鏈接。

我最初的想法是使用令牌替換,因此在運行時輸入<a href="http://www.someurl.com?id=[memberid]"></a>會將[memberid]替換為登錄的用戶ID。 。 有什么方法可以攔截響應並運行一些自定義代碼,然后再將其發送回客戶端?

這個問題是相同的,但是答案非常具體。

令牌可能是正確的選擇,但是我還沒有對此進行深入研究。 但是,如果要更改響應,可以使用響應過濾器。

我使用它來最小化此模塊中的結果HTML https://gallery.orchardproject.net/List/Modules/Orchard.Module.JadeX.HtmlMarkupMinifier

這是應該起作用的代碼,或者至少可以給您一個想法。

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));   
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM