एक काफी अनुभवी ASP.Net डेवलपर के रूप में अभी हाल ही में MVC का उपयोग कर शुरू करने के बीच राज्य रखने के लिए, मैं अपने आप को एक पारंपरिक "सर्वर नियंत्रण और ईवेंट हैंडलर" से मेरी मानसिकता को बदलने के लिए थोड़ा संघर्ष कर पाते हैं चीजों को करने के तरीके, चीजों के अधिक गतिशील एमवीसी तरीके में। मुझे लगता है कि मैं धीरे-धीरे वहां जा रहा हूं, लेकिन कभी-कभी एमवीसी "जादू" मुझे फेंकता है।ASP.Net MVC और राज्य - कैसे अनुरोध
मेरे वर्तमान परिदृश्य एक वेब पेज है कि उपयोगकर्ता, एक स्थानीय फ़ाइल ब्राउज़ सर्वर पर अपलोड करें और इस दोहराने जब तक वह साथ काम करने के लिए फ़ाइलों की एक सूची है की अनुमति देता है बनाने के लिए है। जब वह फ़ाइल सूची (जो पृष्ठ पर एक ग्रिड में प्रदर्शित किया जाएगा) के साथ खुश है, वह फ़ाइलों को प्रोसेस और कहा कि एक डेटाबेस में संग्रहीत किया जाएगा कुछ डेटा निकालने के लिए एक बटन पर क्लिक करेंगे।
आखिरी हिस्सा अभी मैं फ़ाइलों की एक सूची का निर्माण, और अनुरोधों के बीच उस सूची बने के रूप में के रूप में तुच्छ कुछ के साथ संघर्ष कर रहा हूँ ताकि महत्वपूर्ण नहीं है,। पारंपरिक दृष्टिकोण में यह बेहद सरल होगा - डेटास्टेट में डेटा जारी रहेगा। लेकिन एमवीसी में मुझे नियंत्रक और विचारों के बीच डेटा पारित करने की आवश्यकता है, और मुझे पूरी तरह से यह नहीं पता कि यह कैसे काम करना है।
मैं मैं बेहतर पोस्ट मेरी इस कोडिंग समस्या की व्याख्या करने की नहीं बल्कि अधूरा प्रयास लगता है।
आदेश मेरी फाइल सूची डेटा रखने के लिए, मैं एक viewmodel मूल रूप से फ़ाइलों की एक टाइप सूची है कि, कुछ अतिरिक्त मेटाडाटा के साथ बनाया है:
public class ImportDataViewModel
{
public ImportDataViewModel()
{
Files = new List<ImportDataFile>();
}
public List<ImportDataFile> Files { get; set; }
...
ध्यान में रखते हुए मैं ब्राउज़िंग के लिए एक रूप है और फ़ाइल को अपलोड:
<form action="AddImportFile" method="post" enctype="multipart/form-data">
<label for="file">
Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" />
</form>
दृश्य अपने मॉडल के रूप में उपयोग कर रहा है viewmodel:
@model MHP.ViewModels.ImportDataViewModel
यह मेरा कार्रवाई करने के लिए फ़ाइल भेज देंगे:
public ActionResult AddImportFile(HttpPostedFileBase file, ImportDataViewModel importData)
{
if (file.ContentLength > 0)
{
ImportDataFile idFile = new ImportDataFile { File = file };
importData.Files.Add(idFile);
}
return View("DataImport", importData);
}
यह क्रिया फ़ाइलों की सूची से युक्त viewmodel उदाहरण के साथ DataImport पेज के लिए दृश्य देता है।
यह एक निश्चित बिंदु तक अच्छी तरह से काम करता है, मैं एक फ़ाइल ब्राउज़ कर सकता हूं और इसे अपलोड कर सकता हूं, और मैं कार्रवाई के अंदर व्यूमोडेल डेटा देख सकता हूं, और फिर भी अगर मैं दृश्य के अंदर ब्रेकपॉइंट डालता हूं और इसे "डीबेल" ", सब कुछ ठीक है।
लेकिन फिर, अगर मैं एक और फ़ाइल अपलोड करने का प्रयास करता हूं, तो AddImportFile कार्रवाई के अंदर ब्रेकपॉइंट डालने पर, आयात डेटा पैरामीटर खाली होता है। तो दृश्य स्पष्ट रूप से कार्रवाई के लिए अपने मॉडल के वर्तमान उदाहरण को पारित नहीं कर रहा है।
एमवीसी नमूने में मैंने किया है, मॉडल उदाहरण "जादुई रूप से" पैरामीटर के रूप में क्रिया विधि को पारित किया गया है, तो अब यह खाली क्यों है?
मुझे लगता है कि असली समस्या एमवीसी की मेरी सीमित समझ है, और शायद यह एक बहुत ही सरल समाधान है। वैसे भी, अगर कोई मुझे सही दिशा में इंगित कर सकता है तो मैं बहुत आभारी हूं।
आप सर्वर पर कहीं भी अपलोड की गई फ़ाइलों को संग्रहीत नहीं कर रहे हैं। आप कैसे उम्मीद करते हैं कि वे पोस्टबैक के बीच बने रहेंगे? आपके पास आपके '
डारिन, आपकी टिप्पणी के लिए धन्यवाद। यह सही है कि मैं सर्वर पर फ़ाइल संग्रहीत नहीं कर रहा हूं। मैं इसे डेटाबेस में संग्रहीत कर सकता हूं, लेकिन यह डाटाबेस स्पेस और उपयोगकर्ता धैर्य का अपशिष्ट होगा, क्योंकि इसमें काफी समय लगेगा और इसके लिए कोई वास्तविक आवश्यकता नहीं है। मैं क्या करना चाहता हूं बस इसे सर्वर मेमोरी में किसी चर के रूप में रखने के लिए है जब तक उपयोगकर्ता इसे संसाधित करने का निर्णय नहीं लेता। फिर मैं उस प्रसंस्करण के आउटपुट को डेटाबेस में संग्रहीत करूंगा। मुझे लगता है कि या तो मैं एमवीसी को गलत तरीके से इस्तेमाल करने की कोशिश कर रहा हूं, या मुझे नहीं पता कि यह कैसे करना है। मुझे नहीं पता कि यह अभी तक कौन सा है ... – TMan
सर्वर मेमोरी में फ़ाइलों को रखना सबसे बुरी चीजों में से एक है। इस कीमत से सभी कीमतों से बचें। इतना ही नहीं कि यह आपके सर्वर पर बहुत सारी मेमोरी का उपभोग करेगा, लेकिन यह न भूलें कि आईआईएस किसी भी समय एप्लिकेशन डोमेन रीसायकल कर सकता है, स्मृति में संग्रहीत सभी डेटा खो देता है। अगर आप सर्वर फार्म में भागते हैं तो क्या होगा?यदि आप सर्वर की याद में संग्रहीत करते हैं तो इसका मतलब है कि खेत के केवल 1 सर्वर में यह जानकारी है और यदि लोड बैलेंसर खेत के किसी अन्य सर्वर पर बाद के अनुरोध भेजता है तो आप जानकारी खो देंगे। –