ViewResult () और ActionResult () के बीच अंतर


295

ASP.NET MVC में ViewResult()और क्या अंतर है ActionResult()?

public ViewResult Index()
{
    return View();
}

public ActionResult Index()
{
    return View();
}

12
बड़ा सवाल है। मैंने एक वीडियो देखा और यूनिट टेस्ट बनाने के लिए इंस्ट्रक्टर ने पहली बार एक्शन के रिटर्न प्रकार को बदल दिया जिसे वह एक्शनResult से ViewResult में टेस्ट करने जा रहा था। कोई स्पष्टीकरण नहीं .... मैं "क्या हम सिर्फ यादृच्छिक रूप से परिवर्तन कर सकते हैं? कोई स्पष्टीकरण के साथ" की तरह था
डौग चेम्बरलेन

3
संभवतः यह प्रलेखन सहायक है :) msdn.microsoft.com/en-us/library/…
user3885927

जवाबों:


372

ActionResult एक अमूर्त वर्ग है जिसमें कई उपप्रकार हो सकते हैं।

ActionResult उपशीर्षक

  • ViewResult - प्रतिक्रिया स्ट्रीम में एक निर्दिष्ट दृश्य प्रस्तुत करता है

  • PartialViewResult - रेंडर प्रतिक्रिया स्ट्रीम के लिए एक आंशिक दृश्य निर्दिष्ट करता है

  • EmptyResult - एक खाली प्रतिक्रिया लौटा दी जाती है

  • RedirectResult - एक निर्दिष्ट URL के लिए एक HTTP पुनर्निर्देशन करता है

  • RedirectToRouteResult - एक URL पर एक HTTP पुनर्निर्देशन करता है जो रूट इंजन द्वारा निर्धारित रूट डेटा के आधार पर निर्धारित किया जाता है

  • JsonResult - JSON प्रारूप में किसी दिए गए ViewData ऑब्जेक्ट को सीरियल करता है

  • JavaScriptResult - क्लाइंट पर निष्पादित किए जा सकने वाले JavaScript कोड का एक टुकड़ा लौटाता है

  • ContentResult - एक दृश्य की आवश्यकता के बिना प्रतिक्रिया स्ट्रीम में सामग्री लिखता है

  • FileContentResult - क्लाइंट को एक फ़ाइल लौटाता है

  • FileStreamResult - क्लाइंट को एक फाइल लौटाता है, जो कि स्ट्रीम द्वारा प्रदान की जाती है

  • FilePathResult - क्लाइंट को एक फ़ाइल लौटाता है

साधन


5
ActionResult पर ViewResult वापस करने का क्या फायदा है - क्या यह सिर्फ थोड़ा अधिक अर्थपूर्ण है और आपके इरादे को दिखाता है - लेकिन व्यवहार में आमतौर पर कोई फर्क नहीं पड़ता है?
निको

121

ActionResult एक अमूर्त वर्ग है।

ViewResult से निकला ActionResult । अन्य व्युत्पन्न वर्ग में शामिल हैं JsonResult और PartialViewResult

आप इसे इस तरह से घोषित करते हैं ताकि आप बहुरूपता का लाभ उठा सकें और एक ही तरीके से विभिन्न प्रकारों को वापस कर सकें।

उदाहरण के लिए:

public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}

2
क्या इसका मतलब यह है कि हमें हमेशा ActionResult वापस करना चाहिए ताकि हमें इसका फायदा मिल सके। या इसका कोई सीमा या दुष्प्रभाव है?
आदर्श कुमार

5
@ आदर्श - यह C # में किसी भी सार वर्ग के साथ समान है। इसे इस तरह से घोषित करें यदि आप विधि के अंदर कार्यान्वयन को संक्षिप्त करना चाहते हैं या अन्य व्युत्पन्न टाइप के लिए अपने एपीआई को भविष्य में प्रमाण देना चाहते हैं। यदि नहीं, तो कंक्रीट का उपयोग करें। मैं आम तौर पर कंक्रीट का उपयोग करता हूं (जैसे ViewResult या JsonResult)
RPM1984 21

31

यह उसी कारण से है कि आप "ऑब्जेक्ट" को वापस करने के लिए हर वर्ग की हर विधि नहीं लिखते हैं। आपको जितना हो सके उतना विशिष्ट होना चाहिए। यदि आप इकाई परीक्षण लिखने की योजना बना रहे हैं तो यह विशेष रूप से मूल्यवान है। कोई और अधिक परीक्षण रिटर्न प्रकार और / या परिणाम कास्टिंग।


क्लीनर कोड और यूनिट परीक्षण मेरे अनुभव के आधार पर ViewResult का उपयोग करने का लाभ है।
जोशिएट्स

20

ViewResult ActionResult का एक उपवर्ग है। दृश्य विधि एक ViewResult देता है। तो वास्तव में ये दोनों कोड स्निपेट सटीक काम करते हैं। एकमात्र अंतर यह है कि ActionResult एक के साथ, आपका नियंत्रक एक दृश्य वापस करने का वादा नहीं कर रहा है - आप विधि परिभाषा को बदले बिना किसी पुनर्निर्देशन या कुछ और तरीके से सशर्त रूप से वापस करने के लिए विधि बॉडी को बदल सकते हैं।


11

हालांकि अन्य उत्तरों ने अंतरों को सही ढंग से नोट किया है, ध्यान दें कि यदि आप वास्तव में ViewResult लौटा रहे हैं तो आधार ActionResult प्रकार के बजाय अधिक विशिष्ट प्रकार को वापस करना बेहतर है। इस सिद्धांत का एक स्पष्ट अपवाद यह है कि जब आपका तरीका ActionResult से कई प्रकार का रिटर्न देता है।

इस सिद्धांत के पीछे के कारणों की पूरी चर्चा के लिए कृपया संबंधित चर्चा यहाँ देखें: ASP.NET MVC कंट्रोलर मेथड्स एक्शनResult?


4

नियंत्रक में, कोई नीचे सिंटैक्स का उपयोग कर सकता है

public ViewResult EditEmployee() {
    return View();
}

public ActionResult EditEmployee() {
    return View();
}

उपरोक्त उदाहरण में, केवल वापसी प्रकार भिन्न होता है। एक लौटता है ViewResultजबकि दूसरा वापस लौटता है ActionResult

ActionResult एक अमूर्त वर्ग है। यह स्वीकार कर सकते हैं:

ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult आदि।

का ViewResultउपवर्ग है ActionResult


4
मुझे यकीन नहीं है कि यह वही है जो आप का मतलब है, लेकिन सिर्फ मामले में मैं स्पष्ट करना चाहता हूं कि आपके पास एक ही समय में दो तरीके नहीं हो सकते हैं, क्योंकि उनका नाम और (नहीं) पैरामीटर समान हैं। केवल परिणाम प्रकार को बदलकर किसी विधि को ओवरलोड करना संभव नहीं है।
एंड्रयू

0

नियंत्रक में मैंने नीचे दिए कोड को ActionResult के साथ निर्दिष्ट किया है जो एक आधार वर्ग है जो MVC में 11 उपप्रकार हो सकते हैं जैसे: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FileResreamult।

    public ActionResult Index()
                {
                    if (HttpContext.Session["LoggedInUser"] == null)
                    {
                        return RedirectToAction("Login", "Home");
                    }

                    else
                    {
                        return View(); // returns ViewResult
                    }

                }
//More Examples

    [HttpPost]
    public ActionResult Index(string Name)
    {
     ViewBag.Message = "Hello";
     return Redirect("Account/Login"); //returns RedirectResult
    }

    [HttpPost]
    public ActionResult Index(string Name)
    {
    return RedirectToRoute("RouteName"); // returns RedirectToRouteResult
    }

इसी तरह हम इन सभी 11 उपप्रकारों को ActionResult () का उपयोग करके हर उपप्रकार विधि को स्पष्ट रूप से निर्दिष्ट किए बिना वापस कर सकते हैं। यदि आप विभिन्न प्रकार के दृश्य लौटा रहे हैं, तो ActionResult सबसे अच्छी बात है।


0

आपको कुछ समय बचाने के लिए https://forums.asp.net/t/144839..xx पर पिछले उत्तर के लिंक से उत्तर देना है।

ActionResult एक अमूर्त वर्ग है, और यह ViewResult वर्ग के लिए आधार वर्ग है।

MVC फ्रेमवर्क में, यह आपके एक्शन मेथड रिटर्न के ऑब्जेक्ट को संदर्भित करने के लिए ActionResult क्लास का उपयोग करता है। और उस पर ExecuteResult विधि लागू करता है।

और ViewResult इस अमूर्त वर्ग के लिए एक कार्यान्वयन है। यह दिए गए दृश्य नाम से कुछ पूर्वनिर्धारित रास्तों (/ विचारों / नियंत्रकों /, / विचारों / साझा / आदि) में एक पृष्ठ (आमतौर पर एस्पक्स पृष्ठ) खोजने की कोशिश करेगा।

यह आमतौर पर एक अच्छा अभ्यास है कि आपकी विधि एक अधिक विशिष्ट वर्ग लौटाए। इसलिए यदि आप सुनिश्चित हैं कि आपकी कार्रवाई विधि कुछ दृश्य पृष्ठ लौटाएगी, तो आप ViewResult का उपयोग कर सकते हैं। लेकिन अगर आपके एक्शन मेथड में भिन्न व्यवहार हो सकता है, जैसे या तो एक दृश्य प्रस्तुत करना या पुनर्निर्देशन करना। आप रिटर्न प्रकार के रूप में अधिक सामान्य आधार वर्ग ActionResult का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.