Erfassen Sie umhüllte Inhalte im BeginForm-HTML-Helfer

Ich versuche, einen HTML-Helfer im BeginForm-Stil zu schreiben, der IDisposable zum Umbrechen von anderem Code verwendet. Ich möchte, dass der Helfer den umschlossenen Code nur rendert, wenn eine bestimmte Bedingung erfüllt ist (z. B. der Benutzer hat eine bestimmte Rolle).

Ich dachte, ich könnte einfach den Kontext wechseln. Schreiben Sie in der Begin-Methode und wechseln Sie ihn wieder in der Dispose-Methode. Der folgende Code wird kompiliert und ausgeführt, aber der umgebrochene Inhalt wird in allen Fällen gerendert. Wenn ich es durchschreite, wird der umgebrochene Inhalt nicht in den neuen StringWriter geschrieben und liegt daher nicht in meiner Kontrolle.

<code>    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;
        }
    }
</code>

Ist das, was ich versuche, mit HTML-Helfern möglich?

Ich weiß, dass deklarative HTML-Helfer in Rasiermesser wahrscheinlich funktionieren würden, aber angesichts der app_code-Einschränkung von Rasiermesser-Helfern in MVC3 einen Standard-Ansatz für HTML-Helfer vorziehen würden, wenn dies möglich ist.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage