我有一个块的自定义实现,它的工作原理很像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
这一切都很好。但是,当在“剃刀片段”中使用我的块时,我遇到了麻烦,例如,当将一些剃刀内容传递给以 aFunc<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)我该如何解决?