Benutzerdefinierte HTML-Helfer: Erstellen Helfer mit „using“ Anweisung Unterstützung

StackOverflow https://stackoverflow.com/questions/676746

  •  21-08-2019
  •  | 
  •  

Frage

ich meine erste asp.net MVC-Anwendung schreiben, und ich habe eine Frage zu benutzerdefinierten HTML-Helfern:

Für ein Formular erstellen, können Sie verwenden:

<% using (Html.BeginForm()) {%>
   *stuff here*
<% } %>

Ich möchte etwas ähnliches mit einer eigenen HTML-Helfer tun. Mit anderen Worten, ich möchte ändern:

Html.BeginTr();
Html.Td(day.Description);
Html.EndTr();

in:

using Html.BeginTr(){
    Html.Td(day.Description);
}

Ist das möglich?

War es hilfreich?

Lösung

Hier ist eine mögliche wiederverwendbare Implementierung in C #:

class DisposableHelper : IDisposable
{
    private Action end;

    // When the object is created, write "begin" function
    public DisposableHelper(Action begin, Action end)
    {
        this.end = end;
        begin();
    }

    // When the object is disposed (end of using block), write "end" function
    public void Dispose()
    {
        end();
    }
}

public static class DisposableExtensions
{
    public static IDisposable DisposableTr(this HtmlHelper htmlHelper)
    {
        return new DisposableHelper(
            () => htmlHelper.BeginTr(),
            () => htmlHelper.EndTr()
        );
    }
}

In diesem Fall BeginTr und EndTr direkt in dem Antwortstream schreiben. Wenn Sie Erweiterungsmethoden verwenden, die einen String zurückgeben, werden Sie zur Ausgabe von ihnen haben mit:

htmlHelper.ViewContext.HttpContext.Response.Write(s)

Andere Tipps

habe ich versucht, den Rat folgenden hier in MVC3 gegeben, aber ich lief in Schwierigkeiten mit:

htmlHelper.ViewContext.HttpContext.Response.Write(...);

Wenn ich diesen Code verwendet, mein Helfer wurde das Schreiben in den Antwortstream vor meinem Plan gemacht wurde. Das ist nicht gut.

Stattdessen benutzte ich diese:

htmlHelper.ViewContext.Writer.Write(...);

Wenn man sich die Quelle für den ASP.NET MVC (auf Codeplex ), Sie‘ siehe ll die Umsetzung der Begin schließlich ruft nach unten auf den folgenden Code:

static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
{
    TagBuilder builder = new TagBuilder("form");
    builder.MergeAttributes<string, object>(htmlAttributes);
    builder.MergeAttribute("action", formAction);
    builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
    htmlHelper.ViewContext.HttpContext.Response.Write(builder.ToString(TagRenderMode.StartTag));

    return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
}

Die MvcForm Klasse implementiert IDisposable, in seinem dispose-Methode ist, schreibt die auf die Antwort.

Also, was würden Sie tun müssen, um schreiben, um die Tags, die Sie in der Hilfsmethode wollen und ein Objekt zurück, die IDisposable implementiert ... in es dispose-Methode ab dem Tag schließen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top