Захват обернутого содержимого в одноразовом помощнике html в стиле BeginForm

Я пытаюсь написать html-помощник в стиле BeginForm, который использует IDisposable для переноса другого кода. helper для рендеринга обернутого кода только в том случае, если выполняется определенное условие (например, пользователь находится в определенной роли).

Я подумал, что могу просто переключить context.Writer в методе Begin и переключить его обратно в методе Dispose. Приведенный ниже код компилируется и запускается, но обернутое содержимое отображается во всех случаях.Если я прохожу через него, обернутое содержимое не записывается в новый StringWriter и, следовательно, не находится под моим контролем.

    public static IDisposable BeginSecure(this HtmlHelper html, ...)
    {
        return new SecureSection(html.ViewContext, ...);
    }

    private class SecureSection : IDisposable
    {
        private readonly ViewContext _context;
        private readonly TextWriter _writer;

        public SecureSection(ViewContext context, ...)
        {
            _context = context;
            _writer = context.Writer;
            context.Writer = new StringWriter();
        }

        public void Dispose()
        {
            if (condition here)
            {
                _writer.Write(_context.Writer);
            }

            _context.Writer = _writer;
        }
    }

Возможно ли то, что я пытаюсь сделать? с хелперами html?

Я знаю, что декларативные хелперы html в razor, вероятно, будут работать, но я бы предпочел стандартный подход хелперов html, если это возможно, учитывая ограничение app_code хелперов razor в MVC3.

9
задан Paul Hiles 4 April 2012 в 14:22
поделиться