一次性助手(如 Html.BeginForm)
- 首先建立一個一次性類:
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
。
- 建立
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
類時關閉它。
- 要在檢視中使用它:
@using (Html.BeginContainingHelper()) {
<div>element inside our custom element</div>
}