2010-01-05 98 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或非無效的返回類型。

相關問題