2009-06-12 15 views
2

Hauptfrage: Gibt es eine bessere Möglichkeit, ein wiederverwendbares Steuerelement zu erstellen?ASP.Net MVC: Erstellen von benutzerdefinierten Steuerelementen Art von chaotisch?

Also die Idee war, eine Paging-Kontrolle zu machen, um im Grunde aufhören zu stoppen, praktisch das gleiche Markup auf mehreren Ansichten zu tippen. Es dauert dies:

<%= Html.ActionLink("First", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.FirstPage, amountToShow = Model.AmountToShow }))%> 
| 
<%= Html.ActionLink("Previous", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.PreviousPage, amountToShow = Model.AmountToShow }))%> 
| 
<%= Html.ActionLink("Next", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.NextPage, amountToShow = Model.AmountToShow }))%> 
| 
<%= Html.ActionLink("Last", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.LastPage, amountToShow = Model.AmountToShow }))%> 

Und in diese Dreh:

<%= Html.Pager("View", "Controller", "RouteName", Model, new Dictionary<String, Object> { {"parentForumId", Model.ParentForumId}}, " ") %> 

Wo, wie Sie sehen können, ich in der benötigten Ansicht passieren, Controller, Routennamen, Modell und ein Wörterbuch verwendet Anfrage hinzufügen Variablen auf die URL für die Verbindung.

Was ich gefunden habe ist, dass ich eine Erweiterungsmethode für die HtmlHelper-Klasse machen müsste und im Wesentlichen was in ASP.Net eine vollständige Klasse (mit netten Methoden wie CreateChildControls) und alles in eine Hauptmethode, die zurückkehrt ein Faden.

Ist dies der bevorzugte Weg? Eine nette Sache der ASP.Net-Methode war das Markup für die Klasse, denn Sie haben das HTML-Markup-Tag, das Markup-Eigenschaften in Klasseneigenschaften umwandelt. Es ist in der Regel für sauberere Markup, aber zugegebenermaßen "gefälschte" HTML. In dieser Situation habe ich eine Methode mit was könnte eine Meile lang Unterschrift pumpen HTML. Und da ich keine Basis-WebControl-Klasse habe, muss jedes Steuerelement, das ich mache, Methodenaufrufe mit denselben Grundbedürfnissen haben, wie etwa CssClass oder ID.

nun mit, dass gesagt wird, nehme ich gebe ich könnte in einem Wörterbuch, da die HtmlHelper.GenerateRouteLink Methode Attribute, die ich Anrufe für eine irgendwie bin mit, aber dies scheint wirklich wirklich chaotisch.

Gibt es einen besseren Weg, dies zu tun?

Antwort

5

Zuerst ist alles ASP.NET ... einer ist MVC, der andere ist WebForms. Nahm mich eine Sekunde, um zu realisieren, was du sagst, als du sagtest den "ASP.NET Weg". : P

Die Idee mit einem MVC ist, dass Ihre Ansicht "dumm" ist, ohne echtes Verhalten außerhalb der absoluten Grundlagen Grundlagen zum Rendern von Daten. In WebForms waren Ansichten fest an das Verhalten gebunden, das sie gerendert und Ansichtsereignisse verarbeitet hat. Dies machte WebForms-Ansichten, obwohl sie praktisch waren, sehr schwierig, Einheitentests durchzuführen, da der Inhalt und das Verhalten von Ansichten miteinander verknüpft und manchmal vermischt waren.

Der Grund, warum MVC-Ansichten Dinge wie HtmlHelper und AjaxHelper verwenden, besteht darin, das Verhalten so weit wie möglich von der Ansicht getrennt zu halten. Im Gegensatz zu einem Benutzer- oder Serversteuerelement in WebForms können Sie einen HTML-Test vollständig testen.Pager-Extension-Methode, da die Logik reinen Code ist, ohne diese UI-Probleme zu mischen oder mit einer Reihe von nicht testbaren UI-Level-Typen verknüpft zu sein. Die gleiche allgemeine Regel gilt für MVC-Controller ... sie sind nur Code, ohne mit Ereignissen oder Ähnlichem verknüpft zu sein.

Es kann auf kurze Sicht weniger praktisch sein, da Sie derzeit an die alte WebForms-Methode gewöhnt sind. Nehmen Sie sich jedoch etwas Zeit, und Sie werden wahrscheinlich die Vorteile erkennen, die MVCs bevorzugte Vorgehensweise bringt. Das Schreiben einer Pager-Erweiterungsmethode auf HtmlHelper ist in der Tat der bevorzugte Weg, Dinge mit MVC zu tun.

Wie für die Meile lange Signatur-Bit ... eine Suche (ausprobieren Bing.com!) Für fließende Stil Schnittstellen und HtmlHelper. Der fließende Stil fängt in Umgebungen wie MVC-Ansichten an, in denen Sie wahrscheinlich große Signaturen haben. Die allgemeine Idee basiert auf Methodenverkettung, ähnlich wie jQuery, und kann diese langen Signaturen zu einer Reihe von viel kürzeren und sinnvolleren verketteten Methodenaufrufen verkürzen, die Ihren HTML-Helfer mit einem abschließenden Aufruf einer .Render-Methode oder etwas einrichten ähnlich.

+0

haha ​​ja Entschuldigung, ich denke immer noch ASP.NEt gegen MVC –

1

Sie könnten für einige Inspiration Martijn Boland's Pager control ausprobieren.

Persönlich verwende ich für meine wiederverwendbare Gittersteuerung eine Klasse, die alle Informationen enthält, die zum Generieren eines Rasters mit Blättern, Sortieren, ... erforderlich sind. Ich rufe Teilansichten auf, um die separaten Elemente (Pager, Spaltenauswahl, Seitengrößenauswahl) zu generieren , ...), die Informationen, die sie benötigen, an sie weitergeben.

Auf diese Weise kann ich das Raster mit benutzerdefinierten Sachen leicht erweitern. Beispielsweise kann ich eine Mygrid_editableTable.ascx-Ansicht erstellen, um Textfelder anstelle von nur Text anzuzeigen, und eine zusätzliche Spalte mit einer Übergabeschaltfläche hinzufügen. Dies, während Sie weiterhin den Seitenwechsel verwenden, Seitenauswahl, ...

+0

Ja, das ist etwas, was ich gemacht habe (Noland's Pager), da ich eine Modell-Basisklasse habe, die Dinge wie die nächste Seitenzahl und die letzte Seitennummer enthält. Die Ansicht selbst wird mit dieser Modellklasse "typisiert". –

+0

Blick in Teilansichten wie von Robert Harvey und von Ihnen vorgeschlagen. –

2

Sie könnten es in eine Teilansicht einfügen, anstatt einen Helfer zu erstellen.

1

Am Ende verwenden wir HTML-Helfer für Paginatoren, da sie einfach zu Unit-Test sind. Paginierung Geschäftsanforderungen können knifflig sein.

"Zeigen Sie weniger als 35 Links als Zahlen an, dann gruppieren Sie nach 20s, es sei denn, es gibt mehr als 100 Seiten Ergebnisse, in diesem Fall gruppieren Sie nach 100s ... aber donnerstags oder zu GoogleBot, zeigen Sie ... etc."

Plus unsere SEO Jungs ändern ständig ihre Meinung darüber, welche Form URLs die meisten Saft bekommen. In einer solchen Situation ist etwas Testbares ein Muss!

+0

Nun zum Glück ist es nur eine einfache erste, vorherige, nächste, letzte Sache und alles, was auf dem Controller getan wird und die Seitenzahl Werte werden durch das Modell gesendet. Ich kann deinen Standpunkt jedoch sehen. –

Verwandte Themen