2010-01-05 7 views
5

मैंने एक वेब पेज के लिए दो आंशिक कक्षाएं बनाई हैं।क्या मैं एक आंशिक वर्ग में परिभाषित एक फ़ंक्शन को किसी अन्य आंशिक वर्ग से कॉल कर सकता हूं। क्या यह संभव है?

अब मैंने एक फ़ंक्शन की परिभाषा सबमिट की है (सबमिट करें) कि मैं बटन के ऑनसबमिट ईवेंट पर कॉल कर रहा हूं।

लेकिन इस फ़ंक्शन को नहीं कहा जा रहा है, प्रोग्राम संकलित नहीं करता है क्योंकि यह फ़ंक्शन की परिभाषा को खोजने में सक्षम नहीं है, जिसे किसी अन्य आंशिक वर्ग में परिभाषित किया गया था। क्या यह संभव है इस समारोह कॉल करने के लिए या मैं एक ही फाइल में समारोह की defination देने के लिए जहां 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 आंशिक वर्गों रहे हैं और पंजीकरण.एएसपीएक्स मेरी डिजाइन फाइल है। कृपया मुझे बताएं कि क्या आप मेरी समस्या के बारे में कुछ और जानकारी जानना चाहते हैं

मैं DLL फ़ाइलों का उपयोग नहीं कर रहा हूं। कोई precompiled कोड

+0

सभी उत्तर एक ही चीज़ की जांच कर रहे हैं लेकिन मैं जानना चाहता हूं कि मैं अपना नामस्थान कैसे देख सकता हूं। क्योंकि पेज कोड –

+0

में मेरे लिए कोई नेमस्पेस दिखाई नहीं दे रहा है क्या आपके पास इन दोनों वर्गों को समान नामस्थान के अंतर्गत एक ही असेंबली (डीएलएल) में है ...? आंशिक कक्षाएं विभिन्न असेंबली और विभिन्न नामस्थानों पर wok wont ... – RameshVel

+0

मैं यह जांचने में सक्षम नहीं हूं कि वे दोनों एक ही असेंबली या नामस्थान में हैं या नहीं। मैं यह –

उत्तर

5

मुझे लगता है कि आप जिस समस्या का सामना कर रहे हैं वह है क्योंकि आपकी वेबसाइट dynamically compiled है, जो प्रीकंपिल्ड वेब एप्लिकेशन की बजाय है।

जब एएसपी.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

मुझे लगता है कि आप सही दिशा में जा रहे हैं। क्या आप इस पर अधिक विस्तृत जानकारी दे सकते हैं। "प्रीकंपिल्ड वेब एप्लिकेशन की बजाय गतिशील रूप से संकलित।" –

+0

वेब सर्वर पर .aspx फ़ाइलों के साथ .cs फ़ाइलों को तैनात करना = गतिशील रूप से संकलित, बनाम एक या अधिक असेंबली को तैनात करना जिसमें सभी कोड पीछे = precompiled शामिल हैं। – Thorarin

+0

विवरण में जोड़ा गया विवरण, कृपया मेरी मदद करें। –

1

बेशक आप कर सकते हैं। कक्षा (आंशिक या नहीं) में हर दूसरी विधि की तरह आप कक्षा नाम और विधि उदाहरण के उदाहरण के रूप में ClassName.MethodName() या गैर स्थैतिक द्वारा स्थैतिक विधियों को कॉल करते हैं। नाम। नामनाम()

संपादित करें: क्षमा करें मैंने नहीं किया पहले अपने उदाहरण देखें।

यह काम करना चाहिए। आंशिक वर्ग फाइलों में विभाजित है लेकिन इसे एक वर्ग के रूप में संकलित किया गया है। इसलिए, एक ही आंशिक वर्ग का दूसरा भाग किसी अन्य समस्या में बिना किसी समस्या के निजी सदस्यों तक पहुंच सकता है।

+0

देखें, मैं इसे करने का प्रयास कर रहा हूं, लेकिन यह बटन परिभाषा मेरे बटन क्लिक ईवेंट पर उपलब्ध नहीं हो रही है। क्या गुम होगा? –

1

हां, एक (आंशिक) वर्ग पर एक विधि को कॉल करना संभव है।

आंशिक कक्षाएं केवल कुछ भाषाओं (जैसे सी #) की एक विशेषता है - वे आईएल में मौजूद नहीं हैं, क्योंकि वे एक ही कक्षा में एक साथ संकलित हैं।

हालांकि, कभी-कभी यह मुश्किल हो सकता है क्योंकि आंशिक कक्षा घोषणाएं इस विलय के लिए पूरी तरह से समान होनी चाहिए। उस में नामस्थान शामिल है, इसलिए यह आपकी समस्या हो सकती है।

एक उदाहरण के रूप में, यह एक एकल वर्ग में परिणाम होगा:

namespace MyNamespace 
{ 
    public partial class MyClass { } 

    public partial class MyClass { } 
} 

Thre जिसके परिणामस्वरूप वर्ग MyNamespace.MyClass है। बहरहाल, यह दो अलग-अलग वर्गों में परिणाम होगा: MyNamespace.MyClass और MyOtherNamespace.MyClass:

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

namespace MyOtherNamespace 
{ 
    public partial class MyClass { } 
} 

यह दो वर्गों का उत्पादन करेगा। इस मामले में, MyOtherNamespace से this.MyMethod पर कॉल करें।MyClass काम नहीं करेगा।

+0

मैं अपने पेज की जांच करने में सक्षम नहीं हूं जिसमें नामस्थान यह निहित है। मैं इसे कैसे देखूं –

+0

यदि आपके स्रोत कोड में कोई 'नेमस्पेस' घोषणा नहीं है, तो कक्षा सबसे अधिक संभावना 'वैश्विक' नामस्थान में परिभाषित की जाती है। आप परिणामी आईएल में परावर्तक को देखकर इसे सत्यापित कर सकते हैं। –

0

यदि मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आपके पास दो श्रेणियां हैं जो समान कक्षा के लिए आंशिक श्रेणी परिभाषाएं हैं। सही? वे दो अलग-अलग वर्ग नहीं हैं?

यदि दोनों फाइलें एक ही कक्षा के लिए हैं, तो आपको यह सुनिश्चित करना चाहिए कि वे दोनों एक ही नाम स्थान में परिभाषित हैं और कक्षा के नामों को ठीक उसी तरह लिखा गया है। यदि नाम मेल खाते हैं तो यह काम करना चाहिए।

यदि आपके आंशिक वर्ग दो अलग-अलग वर्गों को परिभाषित करते हैं तो नियमित नियमों के लिए लागू होने वाले नियम। किसी अन्य वर्ग के मेटोड को संदर्भित करने के लिए विधि सार्वजनिक होनी चाहिए, और आपको या तो उस वर्ग के उदाहरण के संदर्भ की आवश्यकता है या विधि स्थिर होना चाहिए।

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 नहीं हो सकता या गैर-शून्य वापसी प्रकार।

संबंधित मुद्दे