2009-05-20 15 views
2

Ich habe zwei aspx-Seiten, die sehr ähnlich sind und verschiedene identische Funktionen im Code haben. Ich möchte eine Basisklasse erstellen, von der der Code hinter den Klassen abgeleitet wird. Ist es möglich, dass die Basisklasse auf die Steuerelemente der aspx-Seite zugreift? Zum Beispiel:Verwenden von Aspx-Steuerelemente in der Basisklasse

class base 
    inherits System.Web.UI.Page 
    Sub prepareScreen() 
     'txtName is a text box on the aspx page 
     Me.txtName.text = "George" 
    end sub 
end class 

class codeBehind 
    inherits base 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
      prepareScreen() 
    end sub 
end class 

Etwas verständlicherweise nicht der Code mit kompiliert:

'txtName' is not a member of 'clsbase' 

Ist es möglich, die beiden miteinander zu verbinden?

+0

Überprüfen Sie die Antwort erneut, ich habe einige weitere Erklärungen hinzugefügt. – Kirtan

+0

Hmmm. Wenn Sie den Wert in beiden Seiten festlegen möchten, können Sie den FindControl-Weg verwenden, der nicht OOish ist. – Kirtan

+0

Die auf die Benutzeroberfläche bezogenen Methoden müssen jedoch auf Ihrer Seite isoliert sein und sollten nicht allgemein verwendet werden. Hier möchten Sie Text in ein Textfeld auf Ihrer Seite setzen, also kopieren Sie den Code besser und setzen Sie ihn in beide Seiten, anstatt ihn zu verwenden. – Kirtan

Antwort

2

Sie müssen das Steuerelement als eine Eigenschaft der Basisklasse deklarieren. Verwenden Sie dann im ASP-Markup das CodeFileBaseClass-Attribut.

Die MSDN reference ist nicht mehr verfügbar.

class base 
    inherits System.Web.UI.Page 
    Protected Property txtName() As TextBox 
    Sub prepareScreen() 
     'txtName is a text box on the aspx page 
     Me.txtName.text = "George" 
    end sub 
end class 

class codeBehind 
    inherits base 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
      prepareScreen() 
    end sub 
end class 

<%@ page CodeFileBaseClass="base" inherits="codebehind" ... %> 
+0

Konnte nicht verwendet werden, da die Seiten bereits entworfen wurden (unter Verwendung eines visuellen Designers) und es zu lange gedauert hätte, die Positionen aller Steuerelemente im Code festzulegen. Trotzdem danke – Patrick

0

Sie könnten FindControl verwenden, z.

TextBox txtName=FindControl("txtName"); 

, die die Kontrolle über die gerenderte Seite finden würden, auch wenn es von der abgeleiteten Klasse erbracht wurde. Obwohl dies den Punkt von OO und die Trennung von Funktion/Daten etwas durchbricht.

0

Sie können (TextBox) Page.FindControl ("txtName")) verwenden, um das Textfeld zu erhalten. Seien Sie vorsichtig, denn wenn Sie diese Basisklasse sonst verwenden, wo das Steuerelement möglicherweise nicht vorhanden ist

+0

Nicht wirklich, was ich machen möchte. Ich möchte, dass die Steuerelemente sowohl in der Basisklasse als auch in der abgeleiteten Klasse "nativ" zugänglich sind. Die abgeleiteten Klassen verlinken tatsächlich zu verschiedenen ASPX-Seiten, sie haben nur zahlreiche Steuerelemente gemeinsam. – Patrick

2

Es wäre besser, wenn Sie Ihren Code umgestalten, so dass Sie nicht so etwas tun müssen.

Eine bessere Idee ist, wenn Sie eine virtuelle Methode in der Basisklasse erstellen, die Sie in Ihren untergeordneten Seiten überschreiben können, und den Wert Ihrer Textbox festlegen, da Sie einen einfachen Zugriff auf die Textfeld.

+0

Refaktor in welcher Weise? Ich überarbeite den Code im Moment und versuche, wiederholten Code in eine Basisklasse zu entfernen. – Patrick

+0

Danke für Ihre Zeit Kirtan. Das Problem ist, dass ich den Wert für George auf zwei separaten Seiten festlegen möchte ... – Patrick

0

Als Antwort auf Ihre Klarstellung:

protected TextBox txtName 
{ 
get{return (TextBox)Page.FindControl("txtName");} 
set{Page.FindControl("txtName") = vale;} 
} 

oder Erstellen einer virtuellen Eigenschaft:

Sie eine Eigenschaft erstellen konnte

protected virtual TextBox txtName{get;set;} 

In diesem Fall würden Sie es außer Kraft setzen müssen, um bei Ihre Hauptklasse

protected override TextBox txtName{/*same as above*/} 
Verwandte Themen