私は使用中のテキストが消費され、最終ページに書き込まれないようにするHTMLヘルパーを作ろうとしています。HtmlHelperは内部でhtml/textを消費します
カミソリ:
<div>
<p>
Before Inline
</p>
@using (Html.IncludeInlineScript("testScript"))
{
<script type="text/javascript">
alert("hello world");
</script>
}
<p>
After Inline
</p>
</div>
得られたHTML:
<div>
<p>
Before Inline
</p>
<script type="text/javascript">
alert("hello world");
</script>
<!-- Top of Dispose -->
<!-- Bottom of Dispose -->
<p>
After Inline
</p>
</div>
ヘルパー拡張メソッド:
public static ScriptWrapper IncludeInlineScript(this HtmlHelper helper, string scriptName)
{
return new ScriptWrapper(helper);
}
ラッパー:
public class ScriptWrapper : IDisposable
{
private HtmlHelper _helper;
private TextWriter _originalWriter;
private StringBuilder _scriptContents;
public ScriptWrapper(HtmlHelper helper)
{
_helper = helper;
_originalWriter = _helper.ViewContext.Writer;
_scriptContents = new StringBuilder();
_helper.ViewContext.Writer = new StringWriter(_scriptContents);
}
public void Dispose()
{
_originalWriter.WriteLine("<!-- Top of Dispose -->");
_helper.ViewContext.Writer.Flush();
_helper.ViewContext.Writer = _originalWriter;
_originalWriter.WriteLine("<!-- Bottom of Dispose -->");
}
}
ここでの問題は、ViewContext.Writer
を新しいTextWriterに設定しても、元のライターに書き込んでいることです。 disposeの先頭がスクリプトの後にあるので、disposeは正しい順序で呼び出されていることは明らかです。新しいライターが設定された後のデバッグ中に<script>
ブロックがストリームに存在しませんが、廃棄時には<script>
が元のライターに含まれるようになりました。
ライザーエンジンはライターのローカルコピーを保持していて、別のインスタンスに設定されているという事実を無視していますか?これは私のバグのようです。
私が作成したTextWriterが文字列ビルダーにその値を書き込んだとすれば、あなたは正しいでしょう。代わりに元のライターは、もはやViewContentに接続されていなくても価値を得ました。私はまだこれがMVC5フレームワークの欠陥だと思っています。 – VulgarBinary