一次性助手(如 Html.BeginForm)

  1. 首先创建一个一次性类:
public class MyDisposableHelper: IDisposable
{
   private bool _disposed;        
   private readonly ViewContext _viewContext;

    public MyDisposableHelper(ViewContext viewContext)
    {
        if (viewContext == null)
        {
            throw new ArgumentNullException(nameof(viewContext));
        }            
        _viewContext = viewContext;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (_disposed)
            return;
        _disposed = true;            
        _viewContext.Writer.Write("</div>");
    }

    public void EndForm()
    {
        Dispose(true);
    }
 }

这个类继承了 IDisposable,因为我们想使用像 Html.BeginForm(...) 这样的帮助器。处置时,它关闭了我们在视图中调用助手时创建的 div

  1. 创建 HtmlHelper 扩展方法:
public static MyDisposableHelper BeginContainingHelper(this HtmlHelper htmlHelper) 
{
     var containingTag = new TagBuilder("div");
     //add default css classes, attributes as needed
    htmlHelper.ViewContext.Writer.Write(containingTag .ToString(TagRenderMode.StartTag)); 
    return new MyDisposableHelper (htmlHelper.ViewContext);
}

这里要注意的是调用 Writer.Write 来写入自定义元素的响应页面。TagRenderMode.StartTag 用于告知作者不要关闭 div,因为我们将在处理 MyDisposableHelper 类时关闭它。

  1. 要在视图中使用它:
@using (Html.BeginContainingHelper()) {
    <div>element inside our custom element</div>
}