IDisposable を使用して他のコードをラップする BeginForm スタイルの html ヘルパーを作成しようとしています。特定の条件が満たされた場合 (ユーザーが特定の役割にあるなど) にのみ、ヘルパーがラップされたコードをレンダリングするようにします。
私は単純に、Begin メソッドで context.Writer を切り替えて、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ヘルパーで可能ですか?
Razor の宣言型 HTML ヘルパーはおそらく機能することはわかっていますが、MVC3 の Razor ヘルパーの app_code 制限を考えると、可能であれば標準の html ヘルパー アプローチを好むでしょう。