2009-06-18 10 views
3

Ok, das ist für mich eine sehr schwierige Herausforderung. Wir nehmen unsere bestehende ASP.NET-Website und konvertieren (nur das PL neu gestalten) zu MVC. Unsere Seite ist sehr komplex. Aber der schwierige Teil besteht darin, die vorhandenen benutzerdefinierten Steuerelemente in MVC-Äquivalenz zu konvertieren. Die benutzerdefinierten Steuerelemente (ich spreche nicht über Benutzersteuerelemente) sind natürlich nur eine Klasse, die System.Web.UI.Control erbt und dieses Objekt durchgängig verwendet. Zum Beispiel haben wir einige Eigenschaften am Anfang der vorhandenen benutzerdefinierte Klasse wie folgt:Konvertieren von klassischen benutzerdefinierten ASP.NET-Steuerelement zu MVC

Dictionary<int, Control> configControls; 
DropDownList kControl; 
CheckBox confirmBox; 

all diesen Variablen sind vom Typ Web-Steuerelemente in klassischen ASP.NET.

Also dachte ich mir, dass ich vielleicht das HtmlHelper-Objekt verwenden könnte (ohne komplett neue benutzerdefinierte Steuerelemente neu zu erstellen). Also habe ich versucht, dies:

(umfasst zunächst die Anweisung using die System.Web.MVC.Html an der Spitze meiner neuen benutzerdefinierten Klasse in unserem neuen Web-Projekt umfasst)

private Htmlhelper Helfer; Wörterbuch configControls; helper.DropDownList

aber das funktioniert nicht. Ich schätze, ich kann dieses Objekt nicht einfach so benutzen ?? Ich dachte mir, ich kann HtmlHelper im Dictionary verwenden und dann variable Typen von Helfer deaktivieren. aber das sind nur Erweiterungsmethoden, keine Objekte

Ich weiß nicht von einem Äquivalent zu etwas wie die generische "Control", die wir uns zur Verfügung haben, wie in klassischen ASP.NET erben. Sicherlich wird es in MVC nicht gleich sein (staatenlos und eine völlig unterschiedliche Vorgehensweise), aber was kann ich in MVC mit der gleichen Art von Konzept verwenden?

Also dachte ich mir, dass ich vielleicht das HtmlHelper-Objekt verwenden könnte (ohne komplett neue benutzerdefinierte Steuerelemente neu zu erstellen). Also habe ich versucht, dies:

(umfasst zunächst die Anweisung using die System.Web.MVC.Html an der Spitze meiner neuen benutzerdefinierten Klasse in unserem neuen Web-Projekt umfasst)

private HtmlHelper helper; 
Dictionary configControls; 
helper.DropDownList 

aber dies funktioniert nicht . Ich weiß nicht einmal, ob dieser Ansatz in meiner benutzerdefinierten Steuerung funktioniert. Und wenn ich versuche, meine Hilfsvariable zu verwenden, erhalte ich keine Erweiterungsmethoden, es sei denn, sie befindet sich in einer existierenden Erweiterungsmethode, in der ein HtmlHelper-Parameter übergeben wird. Wenn ich also diese private Variable außerhalb meiner benutzerdefinierten Klasse erzeuge, bekomme ich nichts Intellisense zur Auswahl von "Helfer". Also muss ich das Objekt so definieren:?

private HtmlHelper htmlHelper = new HtmlHelper(); 

aber es fragt nach einem ViewContext und einem IViewDataContainer als params. Wenn ich eine benutzerdefinierte Methode ausbilde, die noch nichts über ihre Ansicht weiß (sollte es nicht nötig haben), weil ich einfach HMTL-Strings in dieser benutzerdefinierten Klasse erzeuge, die an die Extension-Methode übergeben werden, um schließlich Felder auszuspähen Vielleicht kann ich HtmlHelper in einer solchen benutzerdefinierten Klasse nicht verwenden.

Also kann ich dieses Objekt auf eine Weise anstelle von "Control" verwenden? Vielleicht kann ich sogar in meinem Wörterbuch Variablen anstelle von Steuerelement verwenden? Ich weiß nicht und dann Objekt auf HtmlHelper zu werfen, wenn ich diesen Wert aus dem Wörterbuch verwenden oder verweisen muss? Aber im Moment dachte ich, ich könnte das HtmlHelper-Objekt im Dictionary verwenden und dann die Variablen vom Helper abschalten. aber das sind nur Erweiterungsmethoden, keine Objekte.

Ich hoffe, ich mache hier einen Sinn, wenn Sie dies lesen.

+2

Ich habe einen großen Kick von sehen "Classic ASP.net" :) – Hugoware

+0

Vielen Dank für das darauf hin. Ich konnte nicht verstehen, was sich an dieser Frage so merkwürdig anfühlt. :) –

Antwort

0

Ich würde benötigte Business-Logik, gemeinsame Teilansicht (wahrscheinlich, mit ziemlich vielen gut strukturierten Javascript-Zeilen) und separate Controller erstellen.

Dann würde ich diese Reihe von Code durch partial request Technik verwenden.

+0

zähes Konzept nach dem Lesen zu begreifen. Ich sehe nicht, wie das mir in einem CUSTOM-Steuerelement helfen wird, wo ich Methoden erstelle, die zusammen Strings aus HTML und Steuerelementen bilden, die schließlich in einer Ansicht ausgegeben werden. Ich brauche in diesem Fall wirklich keine Teilansicht. Nicht notwendig. Ich spreche hier über eine benutzerdefinierte Klasse. Methoden, die eine HTML-Zeichenfolge zurückgeben, die ein vollständiges Formular dynamisch darstellt und erstellt. – PositiveGuy

+0

Ich glaube nicht, wir sind hier auf der gleichen Wellenlänge – PositiveGuy

+0

Was Sie beschreiben, wäre dann ein Helfer. Ein Helper ist eine statische Methode für eine statische Klasse, die Markup basierend auf den bereitgestellten Parametern zurückgibt. –

0

nicht sicher, wie viel dies hilfreich sein wird, aber tun bei dieser Reihe von Blog-Post einen Blick

Custom controls everywhere

auch einen Blick auf das Projekt Catharsis haben Web-Application Framework - Catharsis - Part I - New Solution

Die Codeplex URL für das gleiche ist Catharsis

Dieses Projekt hat einige gute Beispiele für die Kontrolle erstellen für asp.net mvc.

+0

Ja, aber das ist weit übertrieben für das, was wir hier brauchen, glaube ich. Ich möchte nicht alle diese benutzerdefinierten Steuerelemente so erstellen. Ich möchte nur HTML ausspucken und den HTML-Code für unser dynamisches Webformular über mein benutzerdefiniertes Steuerelement erstellen. Ich hoffe, ich muss nicht eine Menge anderer benutzerdefinierter Steuerelemente erstellen, nur um dynamisch HTML für jeden Feldtyp zu erzeugen. Ich brauche mein benutzerdefiniertes Steuerelement, um es als HTML-String für meine Erweiterungsmethode zu produzieren und zurückzugeben. – PositiveGuy

+0

und wir sind nicht daran interessiert, ein Drittanbieter-Framework zu verwenden, um dies zu tun, wollen wir die Kontrolle über unseren eigenen benutzerdefinierten Code nur mit MVC-Vanilla-Objekte. – PositiveGuy

+0

Keine Probs. Ich habe gerade auf dieses Framework hingewiesen, weil es ein Open Source ist und einige Design-Ideen in Bezug auf benutzerdefinierte Steuerelemente für asp.net mvc hat. Und der andere Teil ist abhängig von dem Projekt, das Sie tun, die einen bestimmten Ansatz für die Entwicklung (eine Art von wiederverwendbaren UI-Framework) annehmen kann, aber es hängt davon ab. Danke für den Kommentar. –

4

Ich habe gerade über diese letzte Nacht gebloggt, einige davon könnten für Sie hilfreich sein.

WebForms And MVC In Harmony — Almost…

Grundsätzlich beschreibt es einige Optionen zur Emulation "WebControls" mit MVC.

Außerdem können Sie weiterhin WebControls verwenden, wie Sie es vorher könnten (vorausgesetzt, sie funktionieren möglicherweise nicht, wenn sie beispielsweise ViewState benötigen). Das Problem, das ich damit entdeckt habe, ist eine Trennung von dem Inline-Render-Code und den WebControls selbst.

Ich habe diese Methode letzte Nacht geschrieben, die Sie WebControls mit Inline-Code verwenden können.

using System.Reflection; 
using System.IO; 
using System.Web.UI; 
using System.Web; 
using System.Web.Mvc; 

public static class MyExtensionMethods { 

//example method - renders a webcontrol to the page 
public static void RenderControl(this HtmlHelper helper, Control control) { 

    //perform databinding if needed 
    MethodInfo bind = control.GetType().GetMethod("DataBind"); 
    if (bind is System.Reflection.MethodInfo) { 
     bind.Invoke(control, null); 
    } 

    //render the HTML for this control 
    StringWriter writer = new StringWriter(); 
    HtmlTextWriter html = new HtmlTextWriter(writer); 
    control.RenderControl(html); 

    //write the output 
    HttpContext.Current.Response.Write(writer.ToString()); 

    //and cleanup the writers 
    html.Dispose(); 
    writer.Dispose(); 
} 

} 

//then used like... 
<% int[] numbers = { 1, 2, 3, 4, 5 }; %> 
<% this.Html.RenderControl(new DataGrid() { DataSource = numbers }); %> 

Nur ein interessantes Konzept Sie interessiert sein könnten.

+1

Verdammt danke. Kompliziertes Shiza. – PositiveGuy

+0

Clever, aber das ist ein Hack. :) –

+1

Ich werde nicht streiten - :) – Hugoware

2

Short von Webforms Kontrollen in Ihrem MVC-Anwendung Hacking, servercontrols mit vielen Methoden Karte nicht zu MVC.

Sie werden durch Teiler und Controller (oder Subcontroller, wenn Sie so etwas mögen) ersetzt.

Wenn Sie nur etwas HTML auf Basis einiger Parameter rendern möchten, dann ist ein Helper genau das, wonach Sie suchen. Statische Klasse, statische Methoden. Wenn Sie jedoch den Status beibehalten und eine Menge Stateful Stuff ausführen müssen, dann sind ein Partial, JS und Controller (oder Subcontroller) genau das, wonach Sie suchen.

Server Steuerelemente, die ihren eigenen Status verwalten, gehören in MVC der Vergangenheit an.

Denken Sie daran, dass MVC ein Versuch ist, das Internet so zu verwenden, wie es funktionieren soll, insbesondere wenn Sie REST ins Bild bringen. Webforms ist eine Fudge, um das Web wie Windows-Formulare arbeiten zu lassen.

+0

Ich denke das gleiche - Web ist schließlich zustandslos. Aber Coffeadict will das anders. –

+0

Ja, ich verstehe das total, aber ich möchte einfach HTML aus meiner Sicht ausspucken, ich verstehe nicht, warum ich dafür ein Teil- oder JavaScript brauche. Alles, was ich will, ist, das benutzerdefinierte Steuerelement reproduzieren zu können, das wir auf staatenlose Weise hatten, um dieses HTML wieder aufwärts an meine Extension-Methode zu übergeben. Dann behalten Sie den Zustand nur durch Verwendung von Kontexten (ControllerContext, ViewContext oder was auch immer) in Ihrem Controller, die Ihnen zur Verfügung stehen. – PositiveGuy

+1

Beachten Sie, dass ich nicht sage, dass Sie JS oder irgendetwas anderes verwenden müssen, wenn Sie nur HTML ausspucken möchten. Das ist genau ein Helfer. Ohne genau zu wissen, was Ihre benutzerdefinierte Kontrolle tut, ist dies die vollständigste Antwort, die ich Ihnen geben kann. –

Verwandte Themen