Ich versuche, eine BeginForm-Stil HTML-Helfer, die IDisposable verwendet, um anderen Code zu wickeln. Ich möchte, dass der Helfer den eingepackten Code nur dann rendert, wenn eine bestimmte Bedingung erfüllt ist (z. B. der Benutzer befindet sich in einer bestimmten Rolle).Capture eingewickelten Inhalt in BeginForm Stil Einweg-HTML-Helfer
Ich dachte, dass ich einfach den context.Writer in der Begin-Methode wechseln und in der Dispose-Methode zurückschalten könnte. Der folgende Code wird kompiliert und ausgeführt, aber der umbrochene Inhalt wird in allen Fällen gerendert. Wenn ich es durchtrete, wird der umgebrochene Inhalt nicht in den neuen StringWriter geschrieben und unterliegt daher nicht meiner Kontrolle.
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;
}
}
Was versuche ich mit HTML-Helfern zu tun?
Ich weiß, dass deklarative HTML-Helfer in Rasierer würde wahrscheinlich funktionieren, aber würde Standard-HTML-Helfer-Ansatz wenn möglich, angesichts der app_code Einschränkung von Rasiermesserhelfer in MVC3 bevorzugen.
Sie sollten den "allowcontent" Code Kommentar-out, nur tun es nichts. Ansonsten bekomme ich verschachtelten Inhalt. Backup ist auch nur erforderlich, wenn Erlaubt ist "falsch" – Alex
Danke @jitbit, ich habe meinen Beitrag aktualisiert. Nur ein nachträglicher Einfall: diese Secured-Klasse fügt sehr wenig Wert gegenüber einfachen integrierten if-Anweisungen hinzu ... Ich würde diesen Weg nur nehmen, wenn Sie den HTML-Code manipulieren müssen und alle anderen Optionen ausprobiert haben. Ich habe viel mit Razor gearbeitet, seit ich diesen Beitrag geschrieben habe, und finde heraus, dass die "Using" -Syntax in Razor Sprachmissbrauch und nicht Syntax-Zucker anzeigt. – Moeri