Die Art und Weise, dass dies mit Begin geschehen ist, ist, dass der Rückgabetyp MvcForm
impliments IDisposable
so, dass, wenn innerhalb einer using
Anweisung verwendet, die Dispose
Methode MvcForm
schreibt das abschließende </form>
Tag aus.
Sie können eine Erweiterungsmethode schreiben, die genau dasselbe tut.
Hier ist eine, die ich gerade schrieb, um zu demonstrieren.
Zunächst einmal, die Erweiterungsmethode:
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);
}
}
Und hier ist unser neuer Typ, MvcAnchor:
public class MvcAnchor : IDisposable
{
private readonly TextWriter _writer;
public MvcAnchor(ViewContext viewContext)
{
_writer = viewContext.Writer;
}
public void Dispose()
{
this._writer.Write("</a>");
}
}
In Ihre Ansichten können Sie jetzt tun:
@{
using (Html.BeginLink())
{
@Html.Raw("Hello World")
}
}
Was das Ergebnis ergibt:
<a>Hello World</a>
diese leicht Erweiterung mit Ihren genauen Anforderungen zu bewältigen:
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);
}
und unserer Ansicht nach:
@{
using (Html.BeginLink("http://stackoverflow.com", "The Worlds Best Q&A site"))
{
@Html.Raw("StackOverflow - Because we really do care")
}
}
, die das Ergebnis liefert:
<a href="http://stackoverflow.com" title="The Worlds Best Q&A site">
StackOverflow - Because we really do care</a>
Fragen Sie, ob es möglich ist, so etwas zu tun: '@ Html.ActionLink (" Hallo World "," MyAction ")'? – CallumVass
Nein, nicht das. Ich weiß, es gibt BeginForm() und EndForm() Art Ansatz, um diese Art von Szenario zu behandeln, aber wenn dies in großem Umfang tun, kann ein Problem verursachen, wenn Sie ein Ende-Tag vergessen. – Sanj
Ich bin mir nicht sicher, ob ich weiß, was du meinst?Sie würden 'BeginForm' in diesem Szenario nicht verwenden? Sie würden 'BeginForm' verwenden, um ein Formular und keinen Ankerlink zu erstellen. – CallumVass