मैं अपना पहला एमवीसी आवेदन एक साथ रख रहा हूं और मेरे लक्ष्य को सही तरीके से पूरा करने के तरीके के बारे में एक प्रश्न है। यहाँ मैं क्या कोशिश कर रहा हूँ ...

मेरे आवेदन में एक क्षेत्र डेटा के बैचों की एक सूची, 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);
}

यह तेज़ है और गंदा लगता है लेकिन जब तक मैं कुछ बेहतर नहीं सीखता... धन्यवाद!

3
Cᴏʀʏ 8 अप्रैल 2011, 22:53

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);    
}
1
BlackTigerX 8 अप्रैल 2011, 23:40
1
यह कमोबेश वह मार्ग है जिसके साथ मैं गया था। मैंने जो किया वह दिखाने के लिए मैंने अपनी पोस्ट अपडेट की।
 – 
Cᴏʀʏ
13 अप्रैल 2011, 22:20

आपको स्विच स्टेटमेंट की आवश्यकता नहीं है। उदाहरण के लिए दृश्य/साझा/ के लिए उपयुक्त स्थान पर एक डिस्प्ले टेम्पलेट या संपादक टेम्पलेट फ़ोल्डर बनाएं और YourRecordType.cshtml फ़ाइलें बनाएं और फिर मॉडल को वापस करने के लिए अपना रिटर्न स्टेटमेंट बदलें। उदाहरण के लिए

-View
 -Shared
  -DisplayTemplates
   -MyRecordTypeA.cshtml
   -MyRecordTypeB.cshtml

return View(records)

उम्मीद है की वो मदद करदे।

1
sarvesh 8 अप्रैल 2011, 23:11
-1: क्या यह रेजर और एमवीसी 3 की विशेषता नहीं है? मैं एमवीसी 2 का उपयोग कर रहा हूँ।
 – 
Cᴏʀʏ
8 अप्रैल 2011, 23:19
असल में, वह इस मामले में काम नहीं करेगा, क्योंकि वह उसी मॉडल प्रकार को वापस कर रहा है। उसे या तो मॉडल को किसी अन्य मॉडल ("मॉडलविथबैचटाइपए", आदि) में लपेटना होगा और फिर उनके लिए टेम्पलेटेड दृश्य और संपादक बनाना होगा। हालाँकि, स्विच विधि उस उदाहरण से बेहतर काम करती है।
 – 
cwharris
8 अप्रैल 2011, 23:52
नहीं, यह MVC2 का हिस्सा है bradwilson.typepad.com/blog/2009/10/…. @xixonia मुझे गलत समझा जा सकता है लेकिन उन्होंने उल्लेख किया कि प्रत्येक बैच का अपना प्रकार है।
 – 
sarvesh
9 अप्रैल 2011, 00:04
ओह, क्षमा करें - यह मुझे मेरे डाउनवोट को पूर्ववत नहीं करने देगा जब तक कि प्रश्न संपादित नहीं किया जाता है।
 – 
Cᴏʀʏ
9 अप्रैल 2011, 00:11
कोई चिंता नहीं, अगर आप अलग मॉडल लौटा रहे हैं तो टेम्पलेट समाधान काम करेगा। मैंने जो लिंक पोस्ट किया है वह बहुत विस्तृत है और आपको सही दिशा में इंगित करना चाहिए।
 – 
sarvesh
9 अप्रैल 2011, 00:19