Frage

Ich versuche, ein Steuerelement mit Vorlagen mit Asp.Net MVC zu erstellen. Durch Templat-Steuerung, meine ich ein Steuerelement, das wie so Markup als Eingabe akzeptiert:

<% Html.PanelWithHeader()
    .HeaderTitle("My Header")
    .Content(() =>
    { %>
        <!-- ul used for no particular reason -->
        <ul>
          <li>A sample</li>
          <li>A second item</li>
        </ul>
    <% }).Render(); %>

Hinweis: Ja, das ist sehr ähnlich wie wie Telerik erstellt seine MVC Kontrollen , ich mag die Syntax.

Hier ist mein PanelWithHeader Code:

// Extend the HtmlHelper
public static PanelWithHeaderControl PanelWithHeader(this HtmlHelper helper)
{
    return new PanelWithHeaderControl();
}

public class PanelWithHeaderControl
{
    private string headerTitle;

    private Action getContentTemplateHandler;

    public PanelWithHeaderControl HeaderTitle(string headerTitle)
    {
        this.headerTitle = headerTitle;

        return this;
    }

    public PanelWithHeaderControl Content(Action getContentTemplateHandler)
    {
        this.getContentTemplateHandler = getContentTemplateHandler;

        return this;
    }

    public void Render()
    {
        // display headerTitle as <div class="header">headerTitle</div>

        getContentTemplateHandler();
    }
}

Dies zeigt die ul, aber ich habe keine Ahnung, wie benutzerdefinierten Code in meiner Render-Methode angezeigt werden soll.

Ich habe versucht, die Htmlhelper ohne Erfolg verwenden. Ich habe auch die ToString-Methode versucht, das Überschreiben der <%=Html.PanelWithHeader()... Syntax in der Lage sein zu verwenden, aber ich hielt Syntaxfehler haben.

Wie kann ich das tun?

War es hilfreich?

Lösung 2

Es stellt sich heraus, dass die Telerik MVC-Erweiterungen sind Open-Source und verfügbar auf CodePlex so nahm ich ein kurzer Blick auf den Quellcode.

Sie schaffen eine Htmltextwriter aus dem Viewcontext der Htmlhelper-Instanz. Wenn sie es schreiben, schreibt es auf der Seite.

Der Code wird:

// Extend the HtmlHelper
public static PanelWithHeaderControl PanelWithHeader(this HtmlHelper helper)
{
    HtmlTextWriter writer = helper.ViewContext.HttpContext.Request.Browser.CreateHtmlTextWriter(helper.ViewContext.HttpContext.Response.Output);

    return new PanelWithHeaderControl(writer);
}

public class PanelWithHeaderControl
{
    private HtmlTextWriter writer;

    private string headerTitle;

    private Action getContentTemplateHandler;

    public PanelWithHeaderControl(HtmlTextWriter writer)
    {
        this.writer = writer;
    }

    public PanelWithHeaderControl HeaderTitle(string headerTitle)
    {
        this.headerTitle = headerTitle;

        return this;
    }

    public PanelWithHeaderControl Content(Action getContentTemplateHandler)
    {
        this.getContentTemplateHandler = getContentTemplateHandler;

        return this;
    }

    public void Render()
    {
        writer.Write("<div class=\"panel-with-header\"><div class=\"header\">" + headerTitle + "</div><div class=\"content-template\">");

        getContentTemplateHandler();

        writer.Write("</div></div>");
    }
}

* Ich weiß, der Code ist ein Chaos

Andere Tipps

public void Render()
{
    Response.Write(getContentTemplateHandler());
}

Sie könnte so etwas wie Html.BeginPanel() / Html.EndPanel(), ähnlich wie Formen tun wollen mit Html.BeginForm() / Html.EndForm() erstellt. Auf diese Weise können Sie den enthaltenen Inhalt wickeln anstatt Notwendigkeit, sie als Parameter zu übergeben.

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