2010-01-05 28 views
5

He creado dos clases parciales para una página web.¿Puedo llamar a una función definida en una clase parcial de otra clase parcial? ¿Es posible?

Ahora he dado una definición de una función, digamos submit() que estoy llamando al evento OnSubmit del botón.

Pero esta función no se está llamando, el programa no se compila ya que no puede buscar la definición de función, que se definió en otra clase parcial. ¿Es posible llamar a esta función o tengo que dar defination de la función en el mismo archivo donde im llamándolo

por ejemplo

<%@ 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

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 
      } 
    } 

Recibo el siguiente error

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 tres archivos que no están en la carpeta App_Code sino que pertenece a una carpeta única de los cuales Registration.aspx.cs, Registration_Database.cs son las clases parciales y Registration.aspx es mi archivo de diseño. Plz, hágamelo saber si desea saber algo más de información sobre mi problema

No estoy usando archivos DLL. Sin código precompilado

+0

todas las respuestas están pronosticando lo mismo, pero me gustaría saber cómo puedo ver mi espacio de nombres. como ningún espacio de nombre es visible para mí en el código de la página –

+0

, ¿tiene estas dos clases en el mismo ensamblado (dll) bajo el mismo espacio de nombres ...? las clases parciales no funcionarán en diferentes ensamblajes y en diferentes espacios de nombres ... – RameshVel

+0

No puedo verificar si ambos se encuentran en el mismo ensamblado o espacio de nombres o no. ¿Cómo puedo verificar esto? –

Respuesta

5

Creo que el problema es que su sitio web es dynamically compiled, en lugar de una aplicación web precompilada.

Cuando se accede por primera vez a la página ASP.NET, el compilador solo buscará en el código detrás del archivo y no buscará en todos los demás archivos .cs el posible código adicional para la misma clase. Por lo tanto, nunca verá la implementación de display(), que a su vez hace que el código detrás del archivo no pueda compilarse.

No utilizaría un método como este para lo que pareciera querer hacer, pero podría definir una clase personalizada que se deriva de System.Web.UI.Page y su página actual deriva de la nueva clase. La definición de clase debería estar en App_Code para un sitio web compilado dinámicamente.

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() 
    { 
     // ... 
    } 
} 

En cualquier caso: desde luego, no debe utilizar las variables estáticas de la manera que los está utilizando, esto causará problemas si varias personas usan su sitio al mismo tiempo. Francamente, tu ejemplo no tiene mucho sentido para mí. Tal vez si tuviéramos más información sobre lo que estamos tratando de lograr, podríamos proporcionar una forma de mejores prácticas para hacerlo.

Tenga en cuenta que en su ejemplo, colocar el segundo archivo en el directorio App_Code no lo hará funcionar. Eso simplemente daría como resultado dos clases con exactamente el mismo nombre de clase (siempre que los espacios de nombres coincidan, por supuesto). Realmente no le gusta eso :)

+0

Creo que estás yendo en la dirección correcta. ¿Puede elaborar más sobre esto? "Compilado dinámicamente, en lugar de una aplicación web precompilada". –

+0

Desplegar los archivos .cs con los archivos .aspx en el servidor web = dinámicamente compilados, en lugar de implementar uno o más ensamblados que contienen todo el código detrás = precompilado. – Thorarin

+0

Detalles agregados a la pregunta, por favor ayúdenme. –

1

Por supuesto que puede. Al igual que cualquier otro método en una clase (parcial o no) llame a los métodos estáticos por ClassName.MethodName() o no estáticos como la creación de la instancia de la clase y llame a instanceName.MethodName()

EDIT: Lo siento, no lo hice mira tus ejemplos al principio.

Eso debería funcionar. La clase parcial se divide en archivos, pero se compila como una sola clase. Entonces, la segunda parte de la misma clase parcial puede acceder a miembros privados definidos en la otra sin problemas.

+0

estoy tratando de hacer eso, pero esta definición de función no está disponible en mi evento de clic de botón. ¿Qué faltaría? –

1

Sí, es posible llamar a un método en una clase (parcial).

Las clases parciales son solo una característica de algunos idiomas (como C#); no existen en IL, ya que se compilan juntas en una sola clase.

Sin embargo, a veces puede ser complicado ya que las declaraciones de clase parciales deben ser totalmente idénticas para que esta fusión ocurra. Ese incluye el espacio de nombres, por lo que este podría ser su problema.

Como ilustración, esto dará lugar a una sola clase:

namespace MyNamespace 
{ 
    public partial class MyClass { } 

    public partial class MyClass { } 
} 

Thre clase resultante es MyNamespace.MyClass. Sin embargo, esto dará lugar a dos clases diferentes:

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

namespace MyOtherNamespace 
{ 
    public partial class MyClass { } 
} 

Esto producirá dos clases: MyNamespace.MyClass y MyOtherNamespace.MyClass. En este caso, una llamada al this.MyMethod desde MyOtherNamespace.MyClass no funcionará.

+0

No he podido verificar mi página en qué espacio de nombres se encuentra. ¿Cómo lo verifico? –

+0

Si no hay una declaración 'namespace' en su código fuente, la clase probablemente se defina en el espacio de nombres 'global'. Puede verificar esto mirando el IL resultante en Reflector. –

0

Si entiendo su pregunta correctamente, tiene dos archivos que contienen definiciones de clases parciales para la clase SAME. ¿Derecha? No son dos clases diferentes?

Si ambos archivos son para la misma clase, entonces debe asegurarse de que ambos estén definidos en el mismo espacio de nombre y que los nombres de las clases se deletreen exactamente igual. Si los nombres coinciden, entonces esto debería funcionar.

Si sus clases parciales definen dos clases diferentes, entonces las mismas reglas que se aplican para las clases normales. Para hacer referencia a un método de otra clase, el método debe ser público, y necesita una referencia a una instancia de esa clase o el método debe ser estático.

1

Esto debería estar bien. Si lo desea, puede formalizar cosas usando métodos parciales; declare el resguardo parcial en un archivo e impleméntelo en el otro. Esto le permitirá identificar rápidamente si tiene dos clases o uno, y destacará intentos de implementar un método parcial que no está definido:

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); 
    } 
} 

Tenga en cuenta que partial métodos deben ser no pública, y no puede tener out o tipos de devolución no anulados

Cuestiones relacionadas