2009-09-19 11 views
9

मैं एएसपी.नेट पेज पोस्ट बैक के बीच वस्तुओं को कैसे बनाए रख सकता हूं?एएसपी.नेट: मैं पोस्टबैक के बीच वस्तुओं को कैसे बनाए रख सकता हूं?

मेरे पास एक एएसपी.नेट वेब पेज है। जब मैं एक एएसपीनेट बटन पर क्लिक करता हूं, तो मैं अपना फ़ंक्शन (सेव) कहूंगा जो मेरी कस्टम क्लास (उपयोगकर्ता डिस्प्ले क्लास) का ऑब्जेक्ट बनाएगा और विवरण को डीबी में सहेज देगा। तो यह एक पोस्ट बैक है। पोस्ट के बाद फिर से वही पेज उपयोगकर्ता को प्रदर्शित किया जाएगा। उस समय, मैं उस उपयोगकर्ता ऑब्जेक्ट को लेना चाहता हूं जिसे मैंने पहले फ़ंक्शन (सेव) में बनाया है। इसे करने का बेहतरीन तरीका क्या है ? मुझे पता है कि मैं इसे एक सत्र में स्टोर कर सकता हूं और इसे एक्सेस कर सकता हूं। लेकिन मैं whethere जानना चाहता हूँ वहाँ कोई और बेहतर तरीका है?

उत्तर

3

दृष्टिकोण आप देख रहे हैं कि एक वस्तु के मूल्यों बांधता डेटा बाइंडिंग तंत्र के कुछ प्रकार है (आप से लोड कर सकता है डीबी अगर यह पहले से मौजूद है) आपके एएसपीनेट वेबफॉर्म पर।

  1. आप
  2. बचाने एक खाली
  3. उपयोगकर्ता प्रपत्र और प्रेस भर जाएगा अपने ऑब्जेक्ट के गुणों के लिए क्षेत्रों के साथ वेबफ़ॉर्म (यानी बक्सें) प्रदर्शित:

    मूल रूप से आप निम्नलिखित होगा

  4. फिर पोस्टबैक होगा। पेज लोड पर आप यह पता लगा सकते हैं कि यह Page.IsPostback के साथ एक पोस्टबैक है और यदि ऐसा है, तो आप एक नई ऑब्जेक्ट बनाते हैं और उपयोगकर्ता द्वारा दर्ज किए गए मानों के साथ इसे भरते हैं।
  5. अपने बटन करें OnClick में, आप डीबी

इस तरह (मैं एक संकलक के बिना मेरे सिर से बाहर यह लिख रहा हूँ विचार करेंगे, तो लेने के देखभाल करने के लिए इसे नीचे के भंडारण के लिए उपयुक्त बीएल विधि कॉल :))

public partial class MyPage : Page 
{ 

    private Person myPersonObj; 

    protected void Page_Load(...) 
    { 

     if(!Page.IsPostback) 
     { 
      //this is not a postback, so you may load an object based on an ID (i.e. in QueryString or create a new one 
      myPersonObj = new Person(); 
     } 
     else 
     { 
      //it is a postback, so unbind the values 
      myPersonObj = new Person(); 
      Unbind(); //the myPersonObj will be filled, the values are managed by ASP.net in the ViewState 
     } 

    } 

    //caution, overriding Page.DataBind() 
    private override void DataBind() 
    { 
     textBoxFirstname.Text = myPersonObj.FirstName; 
     ... 

    } 

    private void Unbind() 
    { 
     myPersonObj.FirstName = textBoxFirstname.Text; 
    } 

    protected void btnSubmit_OnClick(...) 
    { 
     if(Page.IsValid) 
     { 
      Save(); 
     } 
    } 

    private void Save() 
    { 
     //ideal layering with Interfaces 
     IPersonBL personBL = MyBLFactory.Get<IPersonBL>(); 
     personBL.SavePerson(myPersonObj); //call the BL for further validation and then persisting 
    } 
} 

क्या मैं कल जोड़ना चाहते थे, लेकिन भूल गया के बाद से मैं जल्दी करने के लिए किया था:
आप के साथ ही दूसरों वर्णित ViewState या सत्र में अपनी वस्तुओं स्टोर कर सकते हैं, लेकिन मुझे लगता है कि यह होना चाहिए अनुभव किया है निम्नलिखित "नुकसान" (मेरे दृष्टिकोण से) के कारण जितना संभव हो उतना दुर्लभ किया जाना चाहिए:

  • आपका वस्तुओं serializable
  • ViewState में भंडारण drammatically अपने पृष्ठ का आकार में वृद्धि होगी और इस प्रकार अपने पृष्ठ की लोडिंग धीमा होने की जरूरत है। ध्यान दें कि व्यूस्टेट को क्लाइंट में स्थानांतरित किया जाता है और हर बार "पोस्टबैक" होता है। यदि यह केवल संभावना है और आप प्रदर्शन की समस्याओं का सामना कर रहे आप trying this विचार कर सकते हैं (लेकिन यह अपवाद होना चाहिए !!)
  • अपने सत्र में भंडारण वस्तुओं, सर्वर साइड पर लोड डाल सकता है स्मृति लेने वाली वहाँ। आपको अपने सत्र में वस्तुओं को संग्रहीत करने में सावधान रहना चाहिए और संभवतः उन वस्तुओं के विनाश की भी देखभाल करना चाहिए यदि आपको पता है कि आपको अब उनकी आवश्यकता नहीं है।

मैंने वर्णित "डेटाबेस" दृष्टिकोण का लाभ यह है कि आपको हर बार एक नई ताजा वस्तु रखने के "नुकसान" के साथ इन समस्याओं का सामना नहीं करना पड़ता है। इसलिए आपको अपनी ऑब्जेक्ट स्टेटस को संभालने का ख्याल रखना है, यानी मैन्युअल रूप से राउंडट्रिप्स इत्यादि के माध्यम से आईडी को रखना ..

3

आप ऑब्जेक्ट को व्यूस्टेट में स्टोर कर सकते हैं, यह पेज-विशिष्ट स्टोरेज होगा। ऑब्जेक्ट को फिर से क्रमबद्ध किया जाएगा और पेज व्यूस्टेट में इंजेक्शन दिया जाएगा, जिससे पेज बड़ा हो जाएगा।

सत्र में ऑब्जेक्ट को संग्रहीत करके आप पृष्ठ को छोटा रखते हैं लेकिन सर्वर मेमोरी संसाधनों का उपभोग करते हैं।

वैकल्पिक रूप से, आप प्रत्येक बार डेटाबेस से ऑब्जेक्ट पढ़ सकते हैं। यह उपयोगकर्ता को प्रदर्शित करने का लाभ होगा जो डेटाबेस में सहेजा गया था।

7

एक और विकल्प ऑब्जेक्ट को एक अद्वितीय कुंजी (उदा। "उपयोगकर्ता" + आईडी) का उपयोग करके कैश में संग्रहीत करना होगा और केवल वर्तमान सत्र में या व्यूस्टेट में इसकी आईडी को स्टोर करना होगा। एक पोस्टबैक के दौरान, आप ऑब्जेक्ट को कैश से पुनर्प्राप्त कर सकते हैं।

  • आप अपने सत्र में या ViewState
  • अगर एक पोस्टबैक किया जाता है में कम डेटा है, तो आप केवल अगर वस्तु नहीं है DB का उपयोग करने के लिए है:

    इस दृष्टिकोण के साथ

    आप कई फायदे हैं कैश

  • अगर कोई पोस्टबैक किया जाता है, वस्तु अंततः कैश से निकाल दिया जाएगा में लंबे समय तक (स्मृति को मुक्त)
-1

UI में इस

०१२३५१६४१०६ करें
UserDetail userDetail = new UserDetail(); 
    //do your stuff 
    userDetail = UserBL.TransferUserData(userDetail); 

    //do your stuff 

बीएल

में
public static UserDetail TransferUserData(UserDetail userDetail) 
{ 
    // do your processing on userDetail 
    return UserDAL.TransferUserData(userDetail); 
} 

दाल

public static UserDetail TransferUserData(UserDetail userDetail) 
{ 

    //do your processing of db 
    return userDetail; 
}