2014-09-19 5 views
1

Можно ли добавить динамический контент в тело страницы Orchard? Я хотел бы ввести идентификатор текущего зарегистрированного пользователя в ссылки.Внедрение динамического содержимого в тело страницы Orchard

Моя первоначальная мысль заключалась в использовании замены токена, поэтому ввод <a href="http://www.someurl.com?id=[memberid]"></a> заменит [memberid] на идентификатор пользователя во время выполнения. Есть ли способ перехватить ответ и запустить какой-то пользовательский код, прежде чем он будет отправлен обратно клиенту?

This question такое же, однако ответ очень специфичен для их выпуска.

ответ

1

Токены могут быть подходящим способом, но я еще не вникал в это. Но если вы хотите изменить ответ, вы можете использовать фильтры ответов.

Я использовал его, чтобы Минимизировать полученный 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)); 
     } 
    } 
} 
+0

Спасибо за ваш ответ, просто учитывая это, но я получаю HttpException с бесполезным сообщением «Фильтрация не допускается». с кодом ошибки -2147467259. Тем не менее, он все еще попадает в код в методе Flush в фильтре. –

+0

Данг, извините, что слышу это. Я добавил одну нулевую проверку в OnActionExecuting, не могли бы вы попробовать ее с этим? Также, если вы запускаете режим отладки, попробуйте отключить его, если это поможет. – Xeevis

+0

Неверная проверка сделала трюк спасибо. Я также должен был не применять фильтр, если на админ-сайте, который заменял мои жетоны! Произошла ошибка компиляции из-за недоступности WorkContext в 1 области, я исправил это и внес несколько изменений названия, чтобы лучше соответствовать моему проекту. Я добавил редактирование, но он говорит, что он должен быть «проверен экспертом», как только это будет сделано. Я помечаю этот ответ как принятый. –

Смежные вопросы