のように機能するブロックのカスタム実装がありますHtml.BeginForm()
。実装は基本的に次のとおりです。
public class MyBlock : IDisposable {
private readonly HtmlHelper _html;
public MyBlock(HtmlHelper hml) {
this._html.ViewContext.Writer.WriteLine("BEGIN");
}
public void Dispose() {
this._html.ViewContext.Writer.WriteLine("END");
}
}
次に、私の見解では、次のことができます。
@using (new MyBlock(Html)) {
@: some content
}
取得するため:
BEGIN
some content
END
これはすべてうまくいきます。ただし、「かみそりのスニペット」内でブロックを使用すると、たとえば、かみそりのコンテンツを引数として取る関数に渡すときに問題が発生しFunc<object, HelperResult>
ます。たとえば、次のように定義された別の HtmlHelper 関数があります。
public static IHtmlString Content(this HtmlHelper @this, Func<object, HelperResult> razor) {
return razor(null);
}
@* use in a view as: *@
@{
var razorContent = Html.Content(@<div>Some razor content</div>);
}
@razorContent
ただし、次のようにすると、内側のコンテンツは外側のコンテンツなしでレンダリングされます。
@{
var content =Html.Content(
@<text>
@using (new MyBlock(Html)) {
@: some content 2
}
<text>
);
}
@content
問題は、「Html」がまだ外部コンテキストの HtmlHelper を参照しているため、BEGIN と END が「some content 2」とは異なるライターに送信されることだと思いますが、これが事実かどうかはわかりません。
(1)何がうまくいかないのか、(2)どうすれば修正できるのか、誰でも知っていますか?