2009-05-13 16 views
6

यदि मेरे पास एक फॉर्म वाला पृष्ठ है (केवल टेक्स्टबॉक्स और सबमिट बटन के साथ एक साधारण कल्पना करें) और मैं उपयोगकर्ता को गतिशील रूप से जावास्क्रिप्ट के माध्यम से फ़ॉर्म में अधिक टेक्स्टबॉक्स जोड़ने की अनुमति देना चाहता हूं अनुरोध सर्वर पक्ष को संभालने का सबसे अच्छा तरीका क्या है?एएसपी.नेट: नियंत्रण क्लाइंट-साइड

उदाहरण: मैं एक पृष्ठ निम्नलिखित की तरह प्रदान की है:

<input type = "text" id = "control1" name = "control1" /> 
<input type = "text" id = "control2" name = "control2" /> 
<input type = "text" id = "control3" name = "control3" /> 
<input type = "submit" /> 

उपयोगकर्ता ट्रिगर कुछ जावास्क्रिप्ट और पेज की तरह पता चला:

<input type = "text" id = "control1" name = "control1" /> 
<input type = "text" id = "control2" name = "control2" /> 
<input type = "text" id = "control3" name = "control3" /> 
<input type = "text" id = "control4" name = "control4" /> 
<input type = "text" id = "control5" name = "control5" /> 
<input type = "submit" /> 

सबसे अच्छा तरीका है इस तरह की संभाल करने के लिए क्या है स्थिति, या, अधिक आम तौर पर, क्लाइंट और सर्वर दोनों तरफ गतिशील रूप से जेनरेट किए गए इनपुट के साथ काम करना (उदाहरण के लिए, सर्वर से लिया गया कुछ डेटा कहां से शुरू होता है, कहें, डेटाबेस से लिया गया कुछ डेटा)?

उत्तर

0

सर्वर की तरफ Request.Form ["controlN"] में देखें जहां आपको अपने पुराने और नए फ़ील्ड मिलेंगे।

आप गतिशील रूप से की तरह नियंत्रण में जोड़ सकते हैं सर्वर साइड पर:

foreach (Type object in MyDBCollection) 
{ 
    Controls.Add (new TextBox()); 
} 
1

ग्राहक पक्ष पर, एक जे एस समारोह उदाहरण के लिए, आदानों बनाने के लिए करते हैं: सर्वर ..on

var numCtrl = 1; // depends on how many you have rendered on server side 
var addCtrl = function() { 
    var in = document.createElement('input'); 
    in.name = "control" + ++i; 
    in.type = "text"; 
    in.id = "control" + i; 
    document.getElementById("yourcontainer").appendChild(in); 
} 

पक्ष बस अपने HTTP पैरा संग्रह को देखो, इसके माध्यम से पुनरावृत्त करें, और केवल उन मिलान/नियंत्रण \ d */

+2

क्या आप कृपया मुझे बता सकते हैं कि मैं HTTP पैरा संग्रह कैसे प्राप्त कर सकता हूं? – bahith

0

वेबफॉर्म में यदि आपके मूल्यों की अपेक्षा है तो आपके पास बहुत सारे विकल्प नहीं होंगे पोस्टबैक करने के लिए और सामान्य फैशन में उन्हें उपयोग करने में सक्षम हो। मैं सुझाव दूंगा कि आप पृष्ठ जीवन चक्र ( ऑनलोड से पहले) पर नियंत्रण को पंजीकृत करने की अनुमति देने के लिए अजाक्स अपडेट पैनेल का उपयोग करें, इससे आपको इस बात पर भी अंतर आएगा कि आपको बक्से की जरूरत है या नहीं postbacks। अन्य 2 उत्तरों में शामिल जेएस विधियों को पोस्टबैक के माध्यम से टेक्स्टबॉक्स जारी नहीं रखा जाएगा।

एमवीसी आपको अधिक छूट देता है, क्योंकि पागल पृष्ठ जीवन चक्र, नियंत्रण पंजीकरण, व्यूस्टेट आदि आपके रास्ते में आने के लिए नहीं है।

तो बड़ा सवाल यह है कि आप एएसपी.Net के लिए कौन सा मॉडल/फ्रेमवर्क उपयोग कर रहे हैं?


जब से तुम वास्तव में webforms का उपयोग कर रहे, मैं वास्तव में दृढ़ता से आप updatepanels साथ जाना अगर वे आपके लिए काम करेगा सुझाव देते हैं। यह आपको ऐसे तरीके से नियंत्रण जोड़ने की अनुमति देगा जो घटना के सत्यापन में नहीं आते हैं, आदि

+0

हाय, आपके उत्तर के लिए धन्यवाद। मैं वैसे भी वेबफॉर्म का उपयोग कर रहा हूँ। मैं एमवीसी द्वारा थोड़ा सा मोहक हूं, लेकिन मुझे एएसपी.नेट के वेबफॉर्म में क्या पसंद है तेजी से विकास है। यदि मैं विकास समय को धीमा करना चाहता हूं और एमवीसी पैटर्न से संपर्क करना चाहता हूं, तो मुझे लगता है कि मैं Django जैसे कुछ परिपक्व होने के लिए जाऊंगा। – pistacchio

+1

fwiw, मैं MVC काफी अधिक webforms से तेजी से लगता है actuallt है, लेकिन फिर मैं asp.net webforms घृणा :) – annakata

+1

webforms साथ समस्या यह है कि एक बार आप 'बॉक्स' से बाहर आगे और आगे मिलता है अधिक से अधिक crufty यह लगता है। यदि आप सभी अजैक्सी भलाई का लाभ उठाना चाहते हैं, तो वेबफॉर्म अक्सर एचटीएमएल तत्व आईडी और इस तरह के मैंगलिंग के रास्ते में आते हैं। –

2

यदि आप FindControl विधि का उपयोग करके कोड में उन्हें एक्सेस करने में सक्षम होना चाहते हैं, तो AJAX UpdatePanel शायद आपका है बेहतर परिणाम के यह करें। बस याद रखें कि हर बार जब आप अपडेटपेनल अपडेट करते हैं, तो आप पूरे पृष्ठ के जीवन चक्र के माध्यम से जा रहे हैं, लेकिन केवल सर्वर से अपडेट पैनल में प्रस्तुत करने वाले टुकड़े प्राप्त कर रहे हैं, इसलिए ओवरहेड से थके रहें।

यदि आप उन्हें जावास्क्रिप्ट के साथ गतिशील रूप से बनाते हैं तो आप कोड कोड में उनके पास पहुंच प्राप्त करने के लिए FindControl का उपयोग करने में सक्षम नहीं होंगे क्योंकि वे पृष्ठ ईवेंट जीवन चक्र के दौरान फिर से बनाए नहीं जाएंगे। साथ ही, सावधान रहें क्योंकि यदि आप किसी भी समय लूप के साथ उनमें से बहुत से बना रहे हैं तो यह चीजों को धीमा कर सकता है, खासकर इंटरनेट एक्सप्लोरर में।

तुम भी एक के बाद वापस करने के बजाय डेटा सबमिट अगर आप जावास्क्रिप्ट के साथ गतिशील नियंत्रण बना रहे हैं के लिए WEBMETHODS साथ AJAX और WebServices उपयोग करने पर विचार कर सकते हैं।

0

मैंने अपने कई वेबफॉर्म अनुप्रयोगों में jquery का उपयोग करना शुरू कर दिया है और पृष्ठ के वेबमाइड्स के साथ संवाद करने के लिए जेएसओएन का उपयोग करके मुझे पृष्ठ पर कैसे प्रस्तुत किया जाता है और अनावश्यक पोस्टबैक को खत्म करने पर अधिक नियंत्रण मिलता है।

जब मैं एक पोस्टबैक ट्रिगर करना चाहते हैं, मैं जावास्क्रिप्ट का उपयोग पेज कि jQuery रूप से छुपा रहे हैं और फिर एक सर्वर नियंत्रण बटन क्लिक करें पर सर्वर नियंत्रण को भरने के लिए। यदि उपयोगकर्ता जावास्क्रिप्ट का उपयोग नहीं कर सकता है तो यह पृष्ठ को शानदार ढंग से अपनाने की अनुमति देता है।

2

मैंने इस कई बार समान चीजें की हैं। मेरा पसंदीदा दृष्टिकोण आम तौर पर एक अपडेटपेनल के अंदर एक पुनरावर्तक और एक बटन (Add लेबल) का उपयोग करना है।

अपने कोड में Button_OnClick घटना के लिए पीछे इस के समान कुछ करना;

Loop through the Items collection of the Repeater 
Use item.FindControl("txtUserInput") to get the TextBox for that item 
Save the text of each input to List<string> 
Add an empty string to the the list 
Databind the repeater to this new list 

यहां कुछ उदाहरण कोड है;

<asp:Repeater runat="server" ID="rptAttendees"> 
    <ItemTemplate> 
     <asp:TextBox runat="server" ID="txtAttendeeEmail" Text='<%# Container.DataItem %>'></asp:TextBox> 
    </ItemTemplate> 
</asp:Repeater> 



protected void btnAddAttendee_Click(object sender, EventArgs e) 
{ 
    var attendees = new List<string>(); 

    foreach (RepeaterItem item in rptAttendees.Items) 
    { 
     TextBox txtAttendeeEmail = (TextBox)item.FindControl("txtAttendeeEmail"); 
     attendees.Add(txtAttendeeEmail.Text); 
    } 

    SaveAttendees(); 
    attendees.Add(""); 
    rptAttendees.DataSource = attendees; 
    rptAttendees.DataBind(); 
} 
संबंधित मुद्दे