Próbuję napisać pomocnika HTML stylu BeginForm, który używa IDisposable do owinięcia innego kodu. Chcę, aby pomocnik renderował zawijany kod tylko wtedy, gdy spełniony jest określony warunek (np. Użytkownik jest w określonej roli).Przechwyć zapakowaną zawartość w stylu BeginForm w stylu pomocnika html
Pomyślałem, że mogę po prostu zmienić kontekst.Wersja w metodzie Rozpocznij i przełącz ją z powrotem w metodzie Usuwanie. Poniższy kod jest kompilowany i uruchamiany, ale zawijana treść jest renderowana we wszystkich przypadkach. Jeśli przejdę przez to, zawinięte treści nie zostaną zapisane w nowym StringWriter, a zatem nie będą podlegały mojej kontroli.
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;
}
}
Czy to, co próbuję zrobić z pomocą html?
Wiem, że deklaratywni pomocnicy html w maszynce do golenia prawdopodobnie by działali, ale woleliby, jeśli to możliwe, standardowy html helper, biorąc pod uwagę ograniczenie app_code pomocników maszynki do golenia w MVC3.
Należy skomentować wymeldowania się "allowcontent" kodu, po prostu nic nie robić. W przeciwnym razie dostanę zawartość zagnieżdżoną. Kopie zapasowe są potrzebne tylko wtedy, gdy Dozwolone jest "false" – Alex
Dzięki @jitbit, zaktualizowałem swój wpis. Pomyślnie przy okazji: ta klasa Secured dodaje niewiele wartości w porównaniu z prostymi wbudowanymi instrukcjami if ... Mogę wziąć tę trasę tylko wtedy, gdy trzeba manipulować kodem HTML i wypróbować wszystkie inne opcje. Pracowałem z maszynką Razor, odkąd napisałem ten post, i znajduję składnię "używania" w artykule Razor, a nie syntaktycznego cukru. – Moeri