6

我为网页创建了两个部分类。

现在我已经给出了一个函数的定义,比如在按钮的 OnSubmit 事件中调用的 submit()。

但是这个函数没有被调用,程序无法编译,因为它无法搜索在另一个部分类中定义的函数的定义。是否可以调用此函数,或者我必须在我调用它的同一文件中定义函数

例如

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

注册.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 是我的设计文件。如果您想了解有关我的问题的更多信息,请告诉我

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

4

5 回答 5

5

我认为您遇到的问题是因为您的网站是动态编译的,而不是预编译的 Web 应用程序。

首次访问 ASP.NET 页面时,编译器将仅查看代码隐藏文件,而不会搜索所有其他 .cs 文件以查找同一类的可能额外代码。因此,它永远不会看到 的实现display(),进而导致文件后面的代码无法编译。

我当然不会将这样的方法用于您似乎想要做的事情,但是您可以定义一个派生自新类的自定义类,System.Web.UI.Page并让您的实际页面派生自新类。类定义必须App_Code用于动态编译的网站。

注册.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目录中不会使其工作。这只会导致两个类具有完全相同的类名(当然,前提是名称空间匹配)。它真的不喜欢那样:)

于 2010-01-05T12:20:13.743 回答
1

当然可以。像类中的所有其他方法(部分或非)一样,您通过 ClassName.MethodName() 或非静态方法调用静态方法作为创建类的实例并调用 instanceName.MethodName()

编辑:对不起,我一开始没有看到你的例子。

那应该行得通。部分类在文件中拆分,但它被编译为一个类。因此,同一个部分类的第二部分可以毫无问题地访问另一个定义的私有成员。

于 2010-01-05T12:00:24.937 回答
1

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

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

但是,有时可能会很棘手,因为部分类声明必须完全相同才能发生这种合并。这包括 namespace,所以这可能是你的问题。

例如,这将产生一个类:

namespace MyNamespace
{
    public partial class MyClass { }

    public partial class MyClass { }
}

生成的三个类是 MyNamespace.MyClass。但是,这将导致两个不同的类:

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

namespace MyOtherNamespace
{
    public partial class MyClass { }
}

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

于 2010-01-05T12:00:58.720 回答
1

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

如果两个文件都属于同一个类,那么您应该确保它们都定义在同一个名称空间中,并且类名的拼写完全相同。如果名称匹配,那么这应该有效。

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

于 2010-01-05T12:01:20.833 回答
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或非 void 返回类型。

于 2010-01-05T12:17:18.463 回答