ASP.NET MVC में किसी अन्य नियंत्रक से दृश्य प्रदर्शित करें


248

क्या किसी अन्य नियंत्रक से दृश्य प्रदर्शित करना संभव है?

उदाहरण के लिए कहो मेरे पास एक CategoriesControllerऔर एक Category/NotFound.aspxदृश्य है। में रहते हुए CategoriesController, मैं आसानी से वापस आ सकता हूं View("NotFound")

अब कहते हैं कि मेरे पास ProductsControllerउत्पाद जोड़ने के लिए एक एक्शन और एक दृश्य है। हालाँकि, इस क्रिया के लिए आवश्यक है कि उत्पाद को जोड़ने के लिए हमारे पास श्रेणी हो। उदाहरण के लिए, Products/Add/?catid=10

अगर मुझे श्रेणी के आधार पर नहीं मिल catidरहा है, तो मैं उत्पाद नियंत्रक के तहत NotFoundएक CategoryNotFoundदृश्य बनाने के बजाय श्रेणियाँ नियंत्रक से दृश्य दिखाना चाहता हूं ।

क्या यह संभव है या क्या मैं चीजों को गलत तरीके से संरचित कर रहा हूं? क्या ऐसा करने का कोई अच्छा तरीका है?

जवाबों:


283

हाँ। डिफ़ॉल्ट रूप से, ASP.NET MVC पहले चेक करता है \Views\[Controller_Dir]\, लेकिन उसके बाद, यदि यह दृश्य नहीं मिलता है, तो यह चेक इन करता है \Views\Shared

साझा निर्देशिका कई नियंत्रकों में दृश्य साझा करने के लिए विशेष रूप से है। बस साझा किए गए उपनिर्देशिका में अपना दृश्य जोड़ें और आप जाने के लिए अच्छे हैं।

यदि आप करते हैं तो return View("~/Views/Wherever/SomeDir/MyView.aspx")आप जो भी दृश्य चाहेंगे, उसे वापस कर सकते हैं।


धन्यवाद, यह मेरे द्वारा उपयोग किए जाने वाले समाधान की तरह लगता है। मुझे अब भी आश्चर्य है कि क्या किसी अन्य नियंत्रक से एक दृश्य प्रदर्शित करना संभव है। मैं अनुमान लगा रहा हूं कि यह एमवीसी में कुछ नियम का उल्लंघन करता है?
dtc

1
ऊपर वर्णित स्थिति में, आपको साझा फ़ोल्डर का उपयोग करना चाहिए।
जोनाथन फ्रीलैंड

69
हां, यह भी संभव है। यदि आप View ("~ / Views / Wherever / SomeDir / MyView.aspx") करते हैं, तो आप अपनी पसंद का कोई भी दृश्य वापस कर सकते हैं। यह प्रति विशेष किसी नियम का उल्लंघन नहीं करता है, हालांकि, ASP.Net MVC "कॉन्गफिगेशन पर कन्वेंशन" के बारे में है। दूसरे शब्दों में, निश्चित सम्मेलनों का उपयोग करके स्वचालित रूप से संचालित करने के लिए फ्रेमवर्क बनाया गया है, और आपको इसका उपयोग संभव होना चाहिए।
womp

1
स्पष्टीकरण के लिए धन्यवाद। मुझे नहीं पता था कि दृश्य को इस तरह कहा जा सकता है। साझा निर्देशिका पूरी तरह से काम करती है :)
dtc

1
मैं एक कंट्रोलर में नहीं था, इसलिए मुझे इस्तेमाल करना पड़ा new ViewResult { ViewName = "~/Views/Error/Unauthorised.cshtml" };और इसने काम किया
नट

162

आप उपयोग कर सकते हैं:

return View("../Category/NotFound", model);

यह ASP.NET MVC 3 में परीक्षण किया गया था, लेकिन ASP.NET MVC 2 में भी काम करना चाहिए।


3
एमवीसी 2 में काम करता है, और मैं जिस असामान्य स्थिति से निपट रहा हूं, उसके लिए सबसे साफ समाधान निकला।
टोड मेनियर

3
Resharper उस लिंक को त्रुटि के रूप में रिपोर्ट करेगा लेकिन यह अभी भी काम करता है।
CodeMonkeyKing 1

1
@CodeMonkeyKing - Resharper 7 (VS2012 में) एक ऐसे मार्ग की सही पहचान करता है, जिसे प्रारूपित किया गया है "~/Views/Category/NotFound.cshtml"
रिचर्ड ईव

वर्थ नोटिंग: यह सॉल्यूशन डिस्प्ले मोड्स के साथ काम करता है, उदाहरण के लिए यदि आपके पास "/Category/NotFound.Mobile.cshtml" दृश्य है।
BenWillkommen

55

हाँ, यह मुमकिन है। RedirectToAction()इस तरह एक विधि लौटें :

return RedirectToAction("ActionOrViewName", "ControllerName");

1
मेरा मानना ​​है कि इसे RedirectToAction ("ActionOrView", "नियंत्रक", अशक्त) के रूप में जाना चाहिए, अन्यथा दूसरा पैरामैटर रूटवैल्यूज़ है
Zoran P.

लेकिन इस मामले में, आपको वास्तव में व्यू समाधान के विपरीत, नियंत्रक में कार्रवाई लिखना होगा।
तोबेनबेन

@ Tobbenb3 एक परिणाम को हार्डकोड करने के विरोध के रूप में एक बेहतर समाधान है। किसी भी तरह से आप एक पथ स्ट्रिंग में पारित नहीं होना चाहिए।
perustaja

34

क्या आपने कोशिश की है RedirectToAction?


1
मैं कहूंगा कि यह किसी के लिए एमवीसी है जो दृश्य int साझा नहीं करना चाहता है, ध्यान दें कि अन्य सभी समाधानों के लिए (जैसे कि सीधे रास्तों का उपयोग करना) किसी को भी विचारों को फिर से कारक करने की कोशिश नहीं करनी होगी। इसका उपयोग एक अन्य नियंत्रक में भी किया जा रहा है, जिसके परिणामस्वरूप अप्रत्याशित व्यवहार होता है
योएल हलब

4
बिना रीडायरेक्ट के कैसे?
लकी

साझा फ़ोल्डर में दृश्य ले जाने की तुलना में बेहतर समाधान
juFo

इस समाधान के लिए नियंत्रक पर कार्रवाई की आवश्यकता है, देखें (प्रत्यक्षपथ) बिना किसी कार्रवाई के आउटपुट प्रस्तुत करता है। जब आप एक क्रिया जोड़ते हैं, तो आपको इसे url के माध्यम से सीधे पहुंच से छिपाने के लिए सोचने की जरूरत है, यह ब्राउज़र इतिहास आदि में कदम पैदा करेगा लेकिन हां, यह मेरा रास्ता है।
Jan Zahradník

3
RedirectToAction ब्राउज़र को 302 प्रतिक्रिया कोड भेजता है। यह उचित नहीं है जब आप 404 नहीं मिला पेज दिखाने की कोशिश कर रहे हों। यही है, यह समाधान काम करने के लिए प्रकट होता है लेकिन खोज इंजनों को भ्रमित करेगा।
नाइटऑवल 88

20

हाँ तुम कर सकते हो। इस तरह एक कार्रवाई लौटाएँ:

return RedirectToAction("View", "Name of Controller");

एक उदाहरण:

return RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees");

यह दृष्टिकोण जीईटी पद्धति को बुलाएगा

इसके अलावा आप इस तरह कार्रवाई करने के लिए मान पारित कर सकते हैं:

return RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended" });

मैं इस दृष्टिकोण के साथ एक वस्तु कैसे भेजूंगा?
जिरेन

देखिए @Djeroen
ignacio chiazzo

5
आप एक दृश्य नहीं लौटा रहे हैं, आप एक कार्रवाई कह रहे हैं।
0014

ऊपर से मेरे लिए मददगार था।
अनिल श्राद्ध

5

आप जावास्क्रिप्ट / jQuery से किसी भी नियंत्रक को भी कॉल कर सकते हैं । मान लें कि आपके पास 404 या कुछ अन्य उपयोगकर्ता-केंद्र / पृष्ठ पर लौटे नियंत्रक हैं। फिर, कुछ कार्रवाई पर, अपने ग्राहक कोड से, आप कुछ पते पर कॉल कर सकते हैं जो आपके नियंत्रक को आग देगा और परिणाम को HTML प्रारूप में लौटाएगा आपका ग्राहक कोड इस लौटे हुए परिणाम को ले सकता है और इसे आप जहां चाहे अपने पेज में डाल सकता है ...


मैं नहीं जानता था कि। ऐसा लगता है कि यह कुछ है जो मैं भविष्य में उपयोग कर सकता हूं। हां, पीवीसी चट्टानें :)
dtc

1

इस कोड से आप कोई भी नियंत्रक प्राप्त कर सकते हैं:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, 
controller);

अनुवाद: इस कोड से आप कोई भी नियंत्रक प्राप्त कर सकते हैं: [कोड], सादर,
रॉबर्ट कोलंबिया '’

3
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह समस्या का हल कैसे और / या इसके बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे उत्तर के दीर्घकालिक मूल्य में सुधार होगा।
निक 3500
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.