2010-01-05 154 views
5

我为网页创建了两个部分类。我可以从另一个部分类中调用一个部分类中定义的函数吗?可能吗?

现在我已经给出了一个函数的定义说submit(),我打电话在按钮的OnSubmit事件。

但是这个函数没有被调用,程序没有编译,因为它不能够搜索定义在另一个部分类中的函数的定义。是否有可能调用该函数或者我给的功能界定及在同一个文件,其中IM调用它

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

我收到以下错误

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三个文件不在App_Code文件夹,但属于一个文件夹仅外面Registration.aspx.cs,Registration_Database.cs是局部的类和Registration.aspx是我的设计文件。 Plz让我知道如果你想知道更多关于我的问题的信息

我没有使用DLL文件。没有预编码

+0

所有的答案都取决于同样的事情,但我想知道我怎么能看到我的命名空间。因为在页面代码 – 2010-01-05 12:14:46

+0

中没有可见的名称空间,您是否在相同的命名空间下具有相同程序集(dll)中的这两个类...?部分类不会在不同的程序集和不同的命名空间上起作用... – RameshVel 2010-01-05 12:15:47

+0

我不能检查它们是否位于相同的程序集或命名空间中。我怎样才能检查这个 – 2010-01-05 12:29:56

回答

5

我认为你遇到的问题是因为你的网站是dynamically compiled,而不是预编译的web应用程序。

第一次访问ASP.NET页面时,编译器只会查看文件后面的代码,并且不会搜索所有其他.cs文件以查找可能的同一类的额外代码。因此,它永远不会看到display()的执行,这反过来导致文件后面的代码无法编译。

我肯定不会使用类似这样的方法来做你想做的事情,但是你可以定义一个从System.Web.UI.Page派生的自定义类,让你的实际页面从新类派生。对于动态编译的网站,类定义必须在App_Code之内。

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

在任何情况下:你当然不应该使用静态变量,你使用的是他们的方式,这如果多人同时使用您的网站会导致问题。坦率地说,你的榜样对我来说没有多大意义。也许如果我们有更多关于你想要完成的信息,我们可以提供一个最佳实践方式来完成。

请注意,在您的示例中,将第二个文件放入App_Code目录不会使其工作。这只会导致两个类具有完全相同的类名(当然提供了名称空间匹配)。它真的不是这样的:)

+0

我认为你正在走向正确的方向。你可以详细说明这一点:“动态编译,而不是预编译的Web应用程序。” – 2010-01-05 12:45:47

+0

在Web服务器上部署带有.aspx文件的.cs文件=动态编译,与部署一个或多个包含=预编译后的所有代码的部件。 – Thorarin 2010-01-05 12:49:19

+0

详情已添加到问题,请帮我。 – 2010-01-05 12:53:05

1

当然可以。和类中的其他方法一样(部分或者不是),你可以通过ClassName.MethodName()或非静态方法调用静态方法来创建类的实例并调用instanceName.MethodName()

编辑:对不起,我没有首先看你的例子。

这应该工作。部分类被分割成文件,但它被编译为一个类。因此,同一部分类的第二部分可以访问另一部分中定义的私有成员,而不会出现任何问题。

+0

我试图做到这一点,但这个函数的定义是没有得到availabe在我的按钮点击事件。会丢失什么? – 2010-01-05 12:01:49

1

是的,可以调用(部分)类的方法。

部分类只是某些语言(如C#)的一个特性 - 它们不在IL中存在,因为它们一起编译到一个类中。

但是,它有时可能会非常棘手,因为部分类声明必须完全相同才能进行此合并。 包含命名空间,所以这可能是你的问题。

作为说明,这将导致在一个类:

namespace MyNamespace 
{ 
    public partial class MyClass { } 

    public partial class MyClass { } 
} 

THRE所得类是MyNamespace.MyClass。然而,这将导致两个不同的类别:

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

namespace MyOtherNamespace 
{ 
    public partial class MyClass { } 
} 

这将产生两个类:MyNamespace.MyClass和MyOtherNamespace.MyClass。在这种情况下,从MyOtherNamespace调用this.MyMethod。MyClass不起作用。

+0

我没有能够检查我的页面在哪个命名空间中。我如何检查它。 – 2010-01-05 12:08:02

+0

如果源代码中没有'namespace'声明,那么该类很可能是在'global'命名空间中定义的。您可以通过查看Reflector中产生的IL来验证这一点。 – 2010-01-05 12:24:07

0

如果我正确理解你的问题,你有两个文件包含SAME类的部分类定义。对?他们不是两个不同的班级?

如果两个文件都是针对同一个类的,那么您应该确保它们都在相同的名称空间中定义,并且类名拼写完全相同。如果名字匹配,那么这应该起作用。

如果您的部分类定义了两个不同的类,则应用与常规类相同的规则。要引用另一个类的metod,该方法必须是公共的,并且您需要对该类的实例的引用,或者该方法必须是静态的。

1

这应该没问题。如果你愿意,你可以使用部分方法来形式化事物;在一个文件中声明部分存根,并在另一个文件中实现。这将快速识别,如果你有两个类或1,将突出试图实现一个没有定义的部分方法:

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

注意partial方法必须是非公开的,不能有out或非无效的返回类型。

相关问题