मैं अपना पहला एमवीसी आवेदन एक साथ रख रहा हूं और मेरे लक्ष्य को सही तरीके से पूरा करने के तरीके के बारे में एक प्रश्न है। यहाँ मैं क्या कोशिश कर रहा हूँ ...
मेरे आवेदन में एक क्षेत्र डेटा के बैचों की एक सूची, Batch
वस्तुओं की एक सूची प्रस्तुत करता है। प्रत्येक Batch
के लिए, उपयोगकर्ता अपने डेटा को संसाधित करना चुन सकता है। प्रसंस्करण में चरणों का एक सेट होता है जिसे मैं उपयोगकर्ता को एक विज़ार्ड-जैसी दृश्यों की श्रृंखला में प्रस्तुत करूंगा।
प्रत्येक Batch
का एक प्रकार होता है। एल प्रकार के बैच ए में एक्स के रिकॉर्ड शामिल हो सकते हैं, और एम प्रकार के बैच बी में वाई के रिकॉर्ड शामिल हो सकते हैं। बैच प्रकार के आधार पर विज़ार्ड के चरणों में थोड़ा बदलाव होगा। मैं जो नहीं करना चाहता वह यह है (जाहिर है खराब कोड, सिर्फ चित्रण के लिए):
प्रक्रिया नियंत्रक
public ActionResult StepOne(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
var records = BatchRepository.Data.SelectForBatch(batch);
switch (batch.BatchType)
{
case "X":
return View("TypeXStepOne", records);
case "Y":
return View("TypeYStepOne", records);
default:
return View();
}
}
public ActionResult StepTwo(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
var records = BatchRepository.Data.SelectForBatch(batch);
switch (batch.BatchType)
{
case "X":
return View("TypeXStepTwo", records);
case "Y":
return View("TypeYStepTwo", records);
default:
return View();
}
}
...
और इसी तरह। यह एक खराब अभ्यास की तरह लगता है, और जैसा कि मेरा विज़ार्ड 4 या 5 कदम हो सकता है, और मेरे पास वर्तमान में तीन अलग-अलग बैच प्रकार हैं, इन क्रियाओं में कोड की मात्रा को बनाए रखना मुश्किल हो जाता है।
इसे प्रबंधित करने के मामले में एमवीसी मेरे लिए क्या कर सकता है? यदि, उदाहरण के लिए, एक चौथा प्रकार पेश किया गया था, तो मैं आवश्यक कार्य की मात्रा को कम करना चाहता हूं।
मुझे पता है कि मेरे पास शायद होने जा रहा है:
- विज़ार्ड में प्रत्येक बैच प्रकार और चरण के लिए आंशिक दृश्य, वास्तव में इसके आसपास कोई रास्ता नहीं है, हालांकि कुछ आंशिक विचार साझा किए जा सकते हैं।
तो, क्या प्रत्येक बैच प्रकार के लिए एक समर्पित नियंत्रक होना बेहतर होगा? मुझे लगता है कि मैं ऐसा कुछ कर सकता हूं, जहां बैच प्रकार नियंत्रक का नाम बन जाता है।
बैच नियंत्रक
public ActionResult Process(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
return RedirectToAction("StepOne", batch.BatchType, new { id = batch.Id });
}
लेकिन यह नियंत्रक नाम से मेल खाने वाले बैच प्रकार के नाम पर निर्भर करेगा, और मुझे यह भी पसंद नहीं है। अपडेट करें: या, सबसे खराब स्थिति में, मेरे पास मेरे तीन बैच प्रकारों के साथ यहां एक ही स्विच स्टेटमेंट है, और फिर मैं उपयुक्त नियंत्रक को अग्रेषित कर सकता हूं।
तो... विचार! मुझे उनकी जरूरत है। और मैं इसमें अब तक नहीं हूं कि मैं कुछ नया शुरू नहीं कर सकता, मैं सिर्फ एक एमवीसी नौसिखिया के रूप में अपने सिर में विचारों को फेंक रहा हूं। एमवीसी में कुछ ऐसा होना चाहिए जो संदर्भ के आधार पर गतिशील दृश्य स्विचिंग की अनुमति देता है, चाहे वह फैंसी रूटिंग तकनीकों या "व्यू फैक्ट्री" या किसी अन्य चालबाजी से हो।
किसी भी प्रतिक्रिया की बहुत सराहना की जाएगी!
और बस किसी के लिए भी सोच रहा है, मैं .NET 3.5 और IIS6 पर फंस गया हूं, यही कारण है कि मैं 3 के बजाय एमवीसी 2 पर वापस आ गया हूं।
अद्यतन करें
यहां मैं अभी के लिए रोल कर रहा हूं। मैंने बैचकंट्रोलर को कई नियंत्रकों में तोड़ा - प्रत्येक बैच प्रकार के लिए एक। चूंकि वे ज्यादातर एक जैसे हैं, इसलिए मैंने एक सार WizardController
बनाया है जिसमें ये विधियां हैं:
public abstract ActionResult Step(int batchId, int stepNumber);
protected ViewResult ViewStep(int stepNumber, object model)
{
return View(string.Format("Process\Step{0}", stepNumber), model);
}
और मेरे व्युत्पन्न नियंत्रक (ओं) में, कुछ ऐसा:
public override ActionResult Step(int batchId, int stepNumber)
{
var data = BatchRepository.BatchType.SelectByBatchId(batchId);
return ViewStep(stepNumber, data);
}
यह तेज़ है और गंदा लगता है लेकिन जब तक मैं कुछ बेहतर नहीं सीखता... धन्यवाद!
2 जवाब
कॉन्फ़िगरेशन पर कन्वेंशन (नई हार्डकोडिंग), कुछ सरल के रूप में:
public ActionResult Step(int stepNo, int id)
{
var batch = BatchRepository.Batch.SelectById(id);
var records = BatchRepository.Data.SelectForBatch(batch);
return View("Type"+batch.BatchType+"Step"+stepNo, records);
}
आपको स्विच स्टेटमेंट की आवश्यकता नहीं है। उदाहरण के लिए दृश्य/साझा/ के लिए उपयुक्त स्थान पर एक डिस्प्ले टेम्पलेट या संपादक टेम्पलेट फ़ोल्डर बनाएं और YourRecordType.cshtml फ़ाइलें बनाएं और फिर मॉडल को वापस करने के लिए अपना रिटर्न स्टेटमेंट बदलें। उदाहरण के लिए
-View
-Shared
-DisplayTemplates
-MyRecordTypeA.cshtml
-MyRecordTypeB.cshtml
return View(records)
उम्मीद है की वो मदद करदे।
संबंधित सवाल
नए सवाल
asp.net-mvc
ASP.NET MVC फ्रेमवर्क एक ओपन सोर्स वेब एप्लीकेशन फ्रेमवर्क है और टूलींग है जो वेब एप्लिकेशन के अनुरूप तैयार किए गए मॉडल-व्यू-कंट्रोलर (MVC) पैटर्न के एक संस्करण को लागू करता है और एक ASP.NET टेक्नोलॉजी फाउंडेशन पर बनाया गया है।