これを BeginForm で行う方法は、ステートメント内で使用されるとメソッドが終了タグを書き出すように戻り値の型を実装MvcForm
することです。IDisposable
using
Dispose
MvcForm
</form>
まったく同じことを行う拡張メソッドを作成できます。
ここに私がデモンストレーションのために書いたものがあります。
まず、拡張メソッド:
public static class ExtensionTest
{
public static MvcAnchor BeginLink(this HtmlHelper htmlHelper)
{
var tagBuilder = new TagBuilder("a");
htmlHelper.ViewContext.Writer
.Write(tagBuilder.ToString(
TagRenderMode.StartTag));
return new MvcAnchor(htmlHelper.ViewContext);
}
}
そして、これが新しい型 MvcAnchor です。
public class MvcAnchor : IDisposable
{
private readonly TextWriter _writer;
public MvcAnchor(ViewContext viewContext)
{
_writer = viewContext.Writer;
}
public void Dispose()
{
this._writer.Write("</a>");
}
}
ビューで次のことができるようになりました。
@{
using (Html.BeginLink())
{
@Html.Raw("Hello World")
}
}
結果は次のとおりです。
<a>Hello World</a>
これを少し拡張して、正確な要件に対処します。
public static MvcAnchor BeginLink(this HtmlHelper htmlHelper,
string href,
string title)
{
var tagBuilder = new TagBuilder("a");
tagBuilder.Attributes.Add("href",href);
tagBuilder.Attributes.Add("title", title);
htmlHelper.ViewContext.Writer.Write(tagBuilder
.ToString(TagRenderMode.StartTag));
return new MvcAnchor(htmlHelper.ViewContext);
}
そして私たちの見解:
@{
using (Html.BeginLink("http://stackoverflow.com", "The Worlds Best Q&A site"))
{
@Html.Raw("StackOverflow - Because we really do care")
}
}
結果は次のようになります。
<a href="http://stackoverflow.com" title="The Worlds Best Q&A site">
StackOverflow - Because we really do care</a>