.net MVC IDisposable Html Block

  • 222
  • 0
  • 2020-01-01

嘗試製作 IDisposable Html Block

以Razor產生bootstrap mdl-card div套版

public static class HtmlHelperExtension
{
	public static HtmlWrap MdlCardWrapper(this HtmlHelper htmlHelper)
	{
		TagBuilder div1 = new TagBuilder("div");
		div1.AddCssClass("mdl-shadow--1dp mdl-grid");

		TagBuilder div2 = new TagBuilder("div");
		div2.AddCssClass("mdl-card mdl-shadow--2dp mdl-cell--12-col");

		return new HtmlWrap(htmlHelper, new List<TagBuilder> { div1, div2 });
	}

	public static HtmlWrap MdlCardTitle(this HtmlHelper htmlHelper, string cssClass = null)
	{
		TagBuilder div = new TagBuilder("div");
		div.AddCssClass("mdl-card__title mdl-cell--12-col");
		div.AddCssClass(cssClass);

		TagBuilder h = new TagBuilder("h2");
		h.AddCssClass("mdl-card__title-text");

		return new HtmlWrap(htmlHelper, new List<TagBuilder> { div, h });
	}

	public static HtmlWrap MdlCardContent(this HtmlHelper htmlHelper, string cssClass = null)
	{
		TagBuilder div = new TagBuilder("div");
		div.AddCssClass("mdl-card__supporting-text mdl-cell--12-col");
		div.AddCssClass(cssClass);

		return new HtmlWrap(htmlHelper, new List<TagBuilder> { div });
	}
}

public class HtmlWrap: IDisposable
{
	private readonly HtmlHelper _htmlHelper;
	private IEnumerable<TagBuilder> _tags;

	public HtmlWrap(HtmlHelper htmlHelper, IEnumerable<TagBuilder> tags)
	{
		_htmlHelper = htmlHelper;
		_tags = tags;
		this.BeginWrap();
	}

	public void Dispose()
	{
		this.EndWrap();
	}

	public void BeginWrap()
	{
		foreach (var tag in _tags)
		{
			_htmlHelper.ViewContext.Writer.Write(tag.ToString(TagRenderMode.StartTag));
		}
	}

	public void EndWrap()
	{
		foreach (var tag in _tags.Reverse())
		{
			_htmlHelper.ViewContext.Writer.Write(tag.ToString(TagRenderMode.EndTag));
		}
	}
}

 

原Razor頁面

套用後頁面