Cha*_*ion 8 c# idisposable html.beginform razor asp.net-mvc-3
我有一个类似于块的自定义实现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");
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我看来,我可以这样做:
@using (new MyBlock(Html)) {
@: some content
}
Run Code Online (Sandbox Code Playgroud)
要得到:
BEGIN
some content
END
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,当我在"razor片段"中使用我的块时遇到麻烦,例如将一些剃刀内容传递给一个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
Run Code Online (Sandbox Code Playgroud)
但是,当我执行以下操作时,内部内容呈现时没有外部内容:
@{
var content =Html.Content(
@<text>
@using (new MyBlock(Html)) {
@: some content 2
}
<text>
);
}
@content
Run Code Online (Sandbox Code Playgroud)
我认为问题是"Html"仍然引用外部上下文的HtmlHelper,因此BEGIN和END被发送给不同于"某些内容2"的作者,但是,我不确定是否是这种情况.
有谁知道(1)出了什么问题,(2)我怎么解决它?
您的问题的部分解决方案是调用 HelperResult 的 WriteTo 方法。您可以将 Content 方法更改为如下所示:
public static void Content(this HtmlHelper @this, Func<object, HelperResult> razor)
{
razor(null).WriteTo(@this.ViewContext.Writer);
}
Run Code Online (Sandbox Code Playgroud)
然后这样使用它:
@{ Html.Content(
@<text>
@using (new MyBlock(Html)) {
@: some content 2
}
</text>
);
}
Run Code Online (Sandbox Code Playgroud)
编辑
如果您想以 IHtmlString 或任何其他字符串的形式返回值,您可以这样做:
public static IHtmlString Content(this HtmlHelper @this, Func<object, HelperResult> razor)
{
using (MemoryStream ms = new MemoryStream())
using (TextWriter tw = new StreamWriter(ms))
{
Delegate @delegate = (Delegate)razor;
WebViewPage target = (WebViewPage)@delegate.Target;
TextWriter tmp = target.Html.ViewContext.Writer;
try
{
target.Html.ViewContext.Writer = tw;
razor(null).WriteTo(tw);
tw.Flush();
ms.Seek(0, SeekOrigin.Begin);
TextReader tr = new StreamReader(ms);
return MvcHtmlString.Create(tr.ReadToEnd());
}
finally
{
target.Html.ViewContext.Writer = tmp;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
821 次 |
| 最近记录: |