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