2010-01-05 8 views
5

Ich habe zwei Teilklassen für eine Webseite erstellt.Kann ich eine in einer Teilklasse definierte Funktion aus einer anderen Teilklasse aufrufen. Ist es möglich?

Jetzt habe ich eine Definition von einer Funktion sagen submit(), dass ich OnSubmit Ereignis der Schaltfläche aufrufen.

Aber diese Funktion wird nicht aufgerufen, das Programm kompiliert nicht, da es nicht in der Lage ist, die Definition einer Funktion zu suchen, die in einer anderen Teilklasse definiert wurde. Ist es möglich, diese Funktion aufzurufen, oder ich habe defination der Funktion in derselben Datei geben, wo im es

zB

<%@ Page Language="C#" MasterPageFile="~/Master Pages/LeftMenu.master" AutoEventWireup="true" CodeFile="Registration.aspx.cs" Inherits="Web_Pages_Authentication_Login_Management_Registration" Title="Registration" StylesheetTheme="Default Theme 1" %> 

Registration.aspx.cs

public partial class Web_Pages_Authentication_Login_Management_Registration : System.Web.UI.Page 
{ 
    private string firstName; 
    private string lastName; 
    private string userName; 
    private string userPassword; 
    private string primaryEmail; 
protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     Display(); 
    } 
} 

Registration_Database.cs Aufruf

public partial class Web_Pages_Authentication_Login_Management_Registration 
    { 
     const string dbFirstName = "@FirstName"; 
     const string dbLastName = "@LastName"; 
     const string dbUserName= "@UserName"; 
     const string dbUserPassword = "@UserPassword"; 
     const string dbPrimaryEmail = "@PrimaryEmail"; 

     void Display() 
      { 
       firstName="XYZ"; //This variable is not accessible when i put both files in different directories 
      } 
    } 

Ich bekomme folgenden Fehler

Error 1 'Web_Pages_Authentication_Login_Management_Registration' does not contain a definition for 'Display' and no extension method 'Display' accepting a first argument of type 'Web_Pages_Authentication_Login_Management_Registration' could be found (are you missing a using directive or an assembly reference?) C:\Documents and Settings\Administrator\Desktop\Online Test\Web Pages\Authentication\Login Management\Registration.aspx.cs 78 20 C:\...\Online Test\ 

Registration.aspx, Registration.aspx.cs, Registration_Database.cs sind drei Dateien, die nicht in App_Code Ordner sind aber nur in einem Ordner gehört, aus dem Registration.aspx.cs, Registration_Database.cs sind Teilklassen und Registration.aspx ist meine Design-Datei. Plz lassen Sie mich wissen, wenn Sie mehr Informationen über mein Problem wissen möchten

Ich verwende keine DLL-Dateien. Kein vorkompilierter Code

+0

Alle Antworten sind die gleiche Sache, aber ich würde gerne wissen, wie ich meinen Namensraum sehen kann. Da im Seitencode –

+0

kein Namespace sichtbar ist, haben Sie beide Klassen in derselben Assembly (DLL) unter dem gleichen Namespace ...? Partielle Klassen arbeiten nicht auf verschiedenen Assemblies und in verschiedenen Namespaces ... – RameshVel

+0

Ich kann nicht überprüfen, ob sie beide in derselben Assembly oder in demselben Namespace liegen oder nicht. Wie kann ich dies überprüfen –

Antwort

5

Ich denke, das Problem, das Sie erleben, ist, weil Ihre Website dynamically compiled ist, anstatt eine vorkompilierte Webanwendung.

Wenn auf die ASP.NET-Seite zum ersten Mal zugegriffen wird, sucht der Compiler nur im Code hinter der Datei und durchsucht nicht alle anderen .cs-Dateien nach möglichem zusätzlichen Code für dieselbe Klasse. Daher wird es nie die Implementierung von display() sehen, was wiederum verursacht, dass der Code hinter der Datei nicht kompiliert werden kann.

Ich würde sicherlich nicht eine Methode wie diese für das, was Sie tun möchten, zu tun, aber Sie könnten eine benutzerdefinierte Klasse definieren, die von System.Web.UI.Page abgeleitet ist und Ihre tatsächliche Seite von der neuen Klasse ableiten. Die Klassendefinition müsste in App_Code für eine dynamisch kompilierte Website sein.

Registration.aspx.cs:

public partial class Web_Pages_Authentication_Login_Management_Registration : MyPage 
{ 
    protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     Display(); 
    } 
} 

App_Code \ MyPage.cs:

public class MyPage : System.Web.UI.Page 
{ 
    protected void Display() 
    { 
     // ... 
    } 
} 

Auf jeden Fall: Sie sicherlich nicht statische Variablen, die die Art und Weise verwenden, sollten Sie sie verwenden, diese wird Probleme verursachen, wenn mehrere Personen Ihre Website gleichzeitig verwenden. Ehrlich gesagt, macht Ihr Beispiel für mich keinen Sinn. Vielleicht, wenn wir mehr Informationen darüber hätten, was Sie erreichen möchten, könnten wir Ihnen einen Best-Practice-Weg bieten.

Beachten Sie, dass das Einfügen der zweiten Datei in das Verzeichnis nicht funktioniert. Das würde einfach zu zwei Klassen mit exakt demselben Klassennamen führen (sofern die Namespaces natürlich übereinstimmen). Es mag das wirklich nicht :)

+0

Ich denke du gehst in die richtige Richtung. Können Sie mehr darüber erfahren. "Dynamisch kompiliert, anstatt einer vorkompilierten Webanwendung." –

+0

Bereitstellen der CS-Dateien mit den ASPX-Dateien auf dem Webserver = dynamisch kompiliert im Vergleich zu dem Bereitstellen einer oder mehrerer Assemblys, die den gesamten Code enthalten, der = vorkompiliert ist. – Thorarin

+0

Details zur Frage hinzugefügt, bitte hilf mir. –

1

Natürlich können Sie. Wie jede andere Methode in einer Klasse (teilweise oder nicht) rufen Sie statische Methoden von ClassName.MethodName() oder nicht statisch als Erstellungsinstanz der Klasse und Aufruf instanceName.MethodName()

EDIT: Sorry, tat ich nicht Sehen Sie sich zuerst Ihre Beispiele an.

Das sollte funktionieren. Partielle Klasse ist in Dateien aufgeteilt, aber es ist als eine Klasse kompiliert. Der zweite Teil derselben partiellen Klasse kann also problemlos auf private Member zugreifen, die im anderen Teil definiert sind.

+0

ich versuche, das zu tun, aber diese Funktion Definition wird nicht verfügbar bei meinem Button Click Event. Was würde fehlen? –

1

Ja, es ist möglich, eine Methode für eine (Teil-) Klasse aufzurufen.

Teilklassen sind nur ein Merkmal einiger Sprachen (z. B. C#) - sie sind in IL nicht vorhanden, da sie in einer einzigen Klasse zusammengefasst sind.

Manchmal kann es jedoch schwierig sein, da partielle Klassendeklarationen für diese Zusammenführung völlig identisch sein müssen. Das enthält den Namespace, also könnte dies Ihr Problem sein.

Zur Veranschaulichung wird dies in einer einzigen Klasse führen:

namespace MyNamespace 
{ 
    public partial class MyClass { } 

    public partial class MyClass { } 
} 

Thre resultierende Klasse MyNamespace.MyClass ist. Dies wird jedoch in zwei verschiedenen Klassen führen:

namespace MyNamespace 
{ 
    public partial class MyClass 
    { 
     public void MyMethod(); 
    } 
} 

namespace MyOtherNamespace 
{ 
    public partial class MyClass { } 
} 

Diese zwei Klassen produzieren: MyNamespace.MyClass und MyOtherNamespace.MyClass. In diesem Fall ein Anruf an this.MyMethod von MyOtherNamespace.MyClass wird nicht funktionieren.

+0

Ich konnte nicht nach meiner Seite suchen, in welchem ​​Namespace es liegt. Wie überprüfe ich es? –

+0

Wenn in Ihrem Quellcode keine Namespace-Deklaration vorhanden ist, wird die Klasse wahrscheinlich im globalen Namespace definiert. Sie können dies überprüfen, indem Sie sich die resultierende IL in Reflector ansehen. –

0

Wenn ich Ihre Frage richtig verstanden habe, haben Sie zwei Dateien, die partielle Klassendefinitionen für die Klasse SAME enthalten. Recht? Sie sind nicht zwei verschiedene Klassen?

Wenn beide Dateien für dieselbe Klasse sind, sollten Sie sicherstellen, dass beide im selben Namensraum definiert sind und die Klassennamen genau gleich geschrieben sind. Wenn die Namen übereinstimmen, sollte dies funktionieren.

Wenn Ihre partiellen Klassen zwei verschiedene Klassen definieren, gelten dieselben Regeln wie für reguläre Klassen. Um auf eine Methode einer anderen Klasse zu verweisen, muss die Methode public sein, und Sie benötigen entweder einen Verweis auf eine Instanz dieser Klasse oder die Methode muss statisch sein.

1

Das sollte in Ordnung sein. Wenn Sie möchten, können Sie Dinge mit partiellen Methoden formalisieren; deklarieren Sie den partiellen Stub in einer Datei und implementieren Sie ihn in der anderen Datei. Dies wird schnell erkennen, wenn Sie zwei Klassen haben oder ein, und Versuche markieren eine partielle Methode zu implementieren, die nicht definiert ist:

partial class Foo 
{ 
    partial void Bar(string someArg); 
    // other code that uses Bar(s) 
} 
partial class Foo 
{ 
    partial void Bar(string someArg) 
    { 
     Console.WriteLine(someArg); 
    } 
} 

Beachten Sie, dass partial Methoden nicht-öffentlich sein müssen und nicht haben kann out oder nicht void Rückgabetypen.

Verwandte Themen