一次性助手(如 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>
}