2011-05-01 24 views
27

मुझे लगता है कि एमवीसी कैसे काम करता है इस बारे में कुछ बुनियादी बातों को याद कर रहा हूं। मेरे पास मेरे होम पेज पर एक खोज फ़ॉर्म है जिसमें उपयोगकर्ता पांच या छह अलग-अलग फ़ील्ड खोज सकता है। तो मेरे पास यह परिणाम मेरे परिणामों की कार्रवाई में ठीक है। परिणाम कार्रवाई इस तरह दिखती है:एमवीसी 3 फॉर्म पोस्ट और लगातार मॉडल डेटा

[HttpPost] 
public ActionResult Results(SearchModel model) 
{ 
    ResultsModel results = new ResultsModel(); 
    results.ResultList = SearchManager.Search(model).ToList(); 

    return View("Results", results); 
} 

मैंने इस पोस्ट के लिए उपर्युक्त विधि को सरल बना दिया है, लेकिन विचार समान है। तो यह सब ठीक काम करता है। मेरे परिणाम पृष्ठ परिणामों की सूची के साथ दिखाई देता है और मेरे उपयोगकर्ता निम्न URL पर है:

http://www.site.com/results

तो ... अब मैं कुछ बहुत ही आम करना चाहते हैं। मेरे पास परिणाम पृष्ठ पर दो ड्रॉपडाउन सूचियां हैं I "प्रति पृष्ठ" और "प्रति पृष्ठ परिणाम" #। मैं इसे कैसे कर सकता हूं और नियंत्रक को मॉडल डेटा का पूरा सेट वापस भेज सकता हूं ताकि मैं नए पैरामीटर से पूछ सकूं? हकीकत में, सर्चमोडेल क्लास में लगभग 60 विभिन्न फ़ील्ड हैं। संभावित रूप से उस डेटा में मॉडल के सभी शामिल हो सकते हैं। आप इसे "पोस्ट बैक" पृष्ठ पर कैसे बनाते हैं?

यह वही प्रश्न मुझे पेजिंग करने के तरीके के बारे में थोड़ा फंस गया है। मेरे पेजिंग लिंक कुछ ऐसे URL पर जाने होगा:

http://www.site.com/results/2

लेकिन वह मानता है कि हम (मैं क्वेरी स्ट्रिंग में डेटा के 60 क्षेत्रों नहीं करना चाहती) GET अनुरोध का जवाब कर रहे हैं और है कि मॉडल डेटा जीईटी अनुरोधों के बीच पारित किया गया है, जो मुझे पता है कि मामला नहीं है।

जैसा कि मैंने कहा, मुझे लगता है कि मुझे एमवीसी 3, मॉडल और फॉर्म पोस्ट के साथ काम करने के बारे में कुछ बुनियादी बातों को याद आ रही है।

क्या कोई मुझे सही दिशा में इंगित करने में मदद कर सकता है? चीजों को स्पष्ट करने के लिए आवश्यकतानुसार इस पोस्ट को संपादित/अपडेट करने में मुझे खुशी होगी।

EDIT: मैं यह भी कहना चाहता था कि मैं सत्र चर में दृश्य मॉडल को संग्रहीत करना चाहता हूं। अंततः यह साइट वेब फार्म में संतुलित लोड होने के अंत में समाप्त हो जाएगी और यदि संभव हो तो मैं सत्र का उपयोग करने से बचने की कोशिश कर रहा हूं। हालांकि, अगर यह एकमात्र विकल्प है, तो मैं एक और सत्र राज्य प्रदाता को कॉन्फ़िगर कर दूंगा, लेकिन मैं नहीं करना चाहूंगा।

+0

एचएम मैं इसके बारे में कुछ विशेषज्ञ राय भी सुनना चाहता हूं लेकिन मुझे बताएं कि आपके पास TempData द्वारा सीधे या परोक्ष रूप से सत्र को खाली करने का विकल्प है। अन्य विकल्प परिणाम पृष्ठ पर छिपे हुए फ़ील्ड के टन होना है। –

+0

क्षमा करें, छिपे हुए फ़ील्ड के साथ वह हिस्सा बकवास है। temhodata का उपयोग करने के लिए सबसे आसान तरीका imho है। –

+0

यह अभी भी इस 2001 की तरह लगता है :( – andrew

उत्तर

15

आप अपने वर्तमान खोज मॉडल पैरामीटर को अपने फॉर्म के रूट मानों में जोड़ सकते हैं। BeginForm के कई संस्करण आपको किसी ऑब्जेक्ट/रूट ValuesDictionary में पास करने की अनुमति देते हैं।

@Html.BeginForm("Action", "Controller", new { SearchModel = Model }, FormMethod.Post) 

यह आपके वर्तमान खोज मॉडल मूल्यों से गुजरना चाहिए ताकि आप उन्हें अगले पृष्ठ प्राप्त करने के लिए पुनः उपयोग कर सकें। आपको एक नियंत्रक क्रिया परिभाषित करने की आवश्यकता है जो किसी भी वर्तमान-पृष्ठ फ़ॉर्म मानों के साथ-साथ SearchModel को स्वीकार करेगी।

मैंने इसे फॉर्म पोस्ट के साथ नहीं किया है, लेकिन मैंने जो किया है और जो दस्तावेज़ कहते हैं, उससे मैं यह कहूंगा।बेशक, इसका मतलब यह भी है कि पृष्ठ पर आपके प्रत्येक पृष्ठ नंबर "लिंक" को पोस्ट करने की आवश्यकता होगी। यह उपयोगकर्ताओं के लिए वास्तव में असुविधाजनक है यदि वे ब्राउज़र में बैक बटन का उपयोग करने में सक्षम होना चाहते हैं। "एक्शन/नियंत्रक/{पेज}" -

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

रिस्पांस टिप्पणी करने के लिए:

हाँ, आप प्रत्येक पृष्ठ लिंक करने के लिए SearchModel जोड़ने के लिए मार्ग मान का उपयोग कर सकते, लेकिन जैसा कि मैंने ऊपर टिप्पणी में कहा, के बाद से लिंक एक "मिलता है," आपके उपयोगकर्ताओं को क्या होगा होगा लिंक के हिस्से के रूप में serialized SearchModel देखें।

किसी भी तरह से, मार्ग मान का उपयोग कर छिपा क्षेत्रों, सत्र या TempData उपयोग किए बिना अपने मूल SearchModel वापस पाने के लिए अपने जवाब है।

+0

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

2

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

[HttpPost] 
public ActionResult Results(SearchModel model) 
{ 
    ResultsModel results = new ResultsModel(); 
    results.ResultList = SearchManager.Search(model).ToList(); 

    TempData["SearchModel"] = model; 

    return View("Results", results); 
} 

    [HttpGet] 
    public ActionResult Results(int? page) 
    { 
     SearchModel model = (SearchModel)TempData["SearchModel"]; 

     ResultsModel results = new ResultsModel(); 
     results.ResultList = SearchManager.Search(model).ToList(); 

     TempData["SearchModel"] = model; 

     return View("Results", results); 
    } 

इस दृष्टिकोण पर कोई विचार? अनुरोधों के बीच पारित खोज पैरामीटर प्राप्त करने के लिए बस इतना कुछ करना पड़ता है। या हो सकता है कि मैं वेबफॉर्म के साथ दृश्यों के पीछे सब कुछ हो रहा था। :)

+0

गरर ... छोटी सी समस्या। TempData स्पष्ट रूप से अभी भी सत्र का उपयोग करता है। मैं नहीं चाहता कि उपयोगकर्ता नहीं करने के लिए परिणामों के अगले पृष्ठ पर जाने के लिए सक्षम हो सिर्फ इसलिए कि वे 20 के लिए चले गए मिनट और उनके सत्र समाप्त हो। बात इस तरह की सत्र की जरूरत नहीं होनी चाहिए। इस पर कोई भी विचार? यह वास्तव में सरल होना चाहिए। मुझे लगता है कि मैं कर रहा हूँ यह उलझी अधिक। – Scott

+0

स्कॉट तुम सिर्फ परिणाम पर छिपा खानों को भरने के TempData उपयोग कर सकते हैं ।।। पेज इस तरह आगे अनुरोधों में सत्र कोई फर्क नहीं पड़ता Btw TempData स्वचालित रूप से दूर फेंक दिया जाता है आप इसका इस्तेमाल करने के बाद दृश्य प्रारंभ करने में –

+0

छिपी हुई फ़ील्ड में अच्छी तरह से यहाँ काम नहीं करेगा मेरे पेजिंग लिंक बस को "http जा रहे हैं:।। // www.site.com/results/2 "(पेज 2 के लिए)। प्रत्येक पेजिंग लिंक फॉर्म सबमिट बटन नहीं है, इसलिए उन छिपे हुए फ़ील्ड कभी वापस नहीं भेजे जाएंगे। यह सिर्फ इतना आसान समस्या प्रतीत होता है, शायद मैं आ रहा हूं यह गलत तरीका है। मैं वास्तव में यह जानना चाहता हूं कि दूसरों ने इसे कैसे हल किया है, यहां तक ​​कि मेरे दृष्टिकोण को ध्यान में रखे बिना भी। – Scott

0

यह वेबफॉर्म खराब व्यक्ति के लिए एक और दिलचस्प विकल्प प्रतीत होता है;) Persisting model state in ASP.NET MVC using Serialize HTMLHelper किसी प्रकार का व्यूस्टेट अवतार। यह एमवीसी फ्यूचर्स का हिस्सा है। निश्चित नहीं है कि यह फ़्यूचर्स प्रोजेक्ट में कितना समय है और यह मुख्य lib में क्यों नहीं जा सकता है।

8

आपका SearchModel वर्ग आपके खोज मानदंडों और अपने परिणामों को शामिल करने के लिए की जरूरत है। नीचे कुछ पसंद है। यदि आप अपने परिणामों के लिए एक पेजेडलिस्ट का उपयोग करते हैं तो इसमें वर्तमान पृष्ठ, कुल पृष्ठ, कुल आइटम इत्यादि शामिल होंगे। आप मूल्यों वाले खोज मानदंडों को केवल अपने पृष्ठ में जानकारी की मात्रा सीमित कर सकते हैं।

public class SearchModel 
{ 
    public string Product { get; set; } 
    public string Sku { get; set; } 
    public string Size { get; set; } 
    public string Manufacturer { get; set; } 
    // etc... 

    public PagedList ResultsList { get; set; } 
} 


[HttpPost] 
public ActionResult Results(SearchModel model) 
{ 
    model.ResultList = SearchManager.Search(model).ToList(); 
    return View(model); 
} 
+0

यह एक दिलचस्प दृष्टिकोण है। मैं कल (या शायद अगले दिन) कोशिश करूँगा और बाद में यहां पोस्ट करूंगा। – Scott

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