Wie kann ich ein Steuerelement mit Vorlagen mit Asp.Net MVC erstellen?
-
10-07-2019 - |
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?
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.