2009-06-18 8 views
5

Zunächst einmal möchte ich feststellen, dass der Zugriff auf serverseitige Steuerelemente in meiner Ansicht in MVC verpönt ist. Allerdings muss ich in meiner Situation (soweit ich das beurteilen kann). Hier ist meine Geschichte. :)Wie kann ich auf ein serverseitiges Steuerelement in einem Codebehind in meinem MVC-Projekt zugreifen?

Ich habe eine Drittanbieter-Kontrolle, die ich in meiner Webanwendung verwende. Ich habe derzeit die Aufgabe erhalten, unsere WebForms-Lösung auf MVC zu portieren. Dieses spezielle Websteuerelement von Drittanbietern benötigt die WebForms-Architektur. Daher möchte ich nur den gleichen Code aus meinem WebForms-Projekt verwenden.

Meine initial approach sollte zwei Websites (eine WebForms-Site und eine MVC-Site) haben und dann die beiden mit iFrames von der MVC-Seite verknüpfen. Während ich weiß, dass das funktionieren würde, war es ein bisschen übertrieben, nur diese spezielle Kontrolle zu verwenden. Nach mehr Forschung, ich discovered, dass ich "die Jungs" mischen und die WebForms-Architektur in einem MVC-Projekt verwenden kann. Daher ist der neue Ansatz, den ich genommen habe, nur Kopieren Sie über die Seiten, die dieses 3rd-Party-Steuerelement in ein bestimmtes Verzeichnis (dh "View \ SomeDir \ WebForms") und ignorieren Sie dieses Verzeichnis in meinem global.asax Datei, so dass das MVC-Routing-System nicht holen sie es nicht auf:

routes.IgnoreRoute("View\SomeDir\WebForms\{*pathInfo}"); 

Leider, wenn ich über die ASPX-Seite auf meine MVC-Projekt kopiert, habe ich entdeckt, dass die Codebehind mir keinen Zugriff auf die zu meiner Kontrolle gewährt Seite. Hier ist, wie die Dinge ein:

<%@ Register 
    Assembly="..." 
    Namespace="..." 
    TagPrefix="custom" %> 

<custom:SomeControl ID="customControl" runat="server" /> 

Hier ist, was hinter meinem Code wie folgt aussieht:

public class MyPage : Page 
{ 
    protected void Page_Load(object sender, EventArgs args) 
    { 
    Debug.WriteLine(customControl.ID); // <-- COMPILE ERROR: Cannot resolve symbol 'customControl' 
    } 
} 

Leider wird mein Projekt nicht einmal kompilieren, weil ich diesen Fehler auf jeder Kontrolle in meinem Codebehind . Es ist kein Problem, die anderen Steuerelemente (dh Labels, Panels, Textboxen usw.) in Client-Tags umzuwandeln, aber ich muss Zugriff auf dieses benutzerdefinierte Steuerelement in meinem Code haben, damit ich es hören kann (serverseitig)) Ereignisse und reagieren entsprechend; grundlegende WebForms Sachen ...

Ist was ich versuche zu tun, sogar möglich? Ein anderer Ansatz, den ich über die Arbeit might dachte, ist das Initialisieren und Trap der serverseitigen Ereignisse in der Controller-Klasse. Ich möchte jedoch vermeiden, den Status der Steuerung in der Ansicht zu serialisieren, einfach, um es an den Controller und zurück zu übergeben, wenn möglich?

Vielen Dank im Voraus für jede Beratung!

Antwort

5

Heiliger Mist !! Ich fand die Lösung 10 Minuten nachdem ich dies gepostet habe.

Die Lösung war, klicken Sie mit der rechten Maustaste auf mein Projekt und sagen Sie "Convert to Web Application" und ändern Sie meine CodeBehind-Klasse zurück in eine "teilweise". Alle meine Steuerelemente sind jetzt über den Code dahinter zugänglich.

Vielen Dank für das Lesen und ich hoffe, meine Frage/Antwort wird jemand anderes eines Tages helfen. :)

0

Ich sehe nicht den Punkt in der Portierung etwas zu MVC, nur um die Hälfte davon in traditionellen WebForms zu halten.

Dieser Ansatz bedeutet, dass zukünftige Entwickler mit beiden Technologien vertraut sein müssen und meiner Meinung nach nicht sauber sind.

Ich würde mit dem einen oder anderen gehen und versuchen, die beiden zu vermischen.

+0

Das Steuerelement, das ich verwende, arbeitet an einer Silverlight-Version und wir wollten schon seit einiger Zeit auf MVC portieren. Was als kleine Seite begann, die nur Funktionalität für dieses spezielle Steuerelement zeigte, wird sich bald verwandeln Ein vollwertiges Webportal und MVC ist das, was wir uns entschieden haben, um ... – Luc

+0

Manchmal ist es nicht machbar, eine gesamte Legacy-Anwendung auf die neueste Technologie zu konvertieren, und ein iterativer Ansatz ist erforderlich. – Stumblor