ViewResult () ve ActionResult () arasındaki fark


295

Arasındaki fark nedir ViewResult()ve ActionResult()ASP.NET MVC?

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

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

12
Harika bir soru. Bir video izledim ve birim testleri oluşturmak için eğitmen önce test edeceği Eylemin dönüş türünü ActionResult'tan ViewResult'a değiştirdi. Hiçbir açıklama .... Ben "Ne tür rastgele değiştirebilir? Hiçbir açıklama ile" gibiydi
Doug Chamberlain

3
Muhtemelen bu belgeler yararlıdır :) msdn.microsoft.com/en-us/library/…
user3885927

Yanıtlar:


372

ActionResult, birkaç alt türe sahip olabilen soyut bir sınıftır.

ActionResult Alt Türleri

  • ViewResult - Yanıt akışına belirli bir görünüm oluşturur

  • PartialViewResult - Yanıt akışına belirli bir kısmi görünüm oluşturur

  • EmptyResult - Boş bir yanıt döndürülür

  • RedirectResult - Belirtilen bir URL'ye HTTP yeniden yönlendirmesi gerçekleştirir

  • RedirectToRouteResult - Belirli rota verilerine göre yönlendirme motoru tarafından belirlenen bir URL'ye HTTP yeniden yönlendirmesi gerçekleştirir

  • JsonResult - Belirli bir ViewData nesnesini JSON biçimine seri hale getirir

  • JavaScriptResult - İstemcide çalıştırılabilecek bir JavaScript kodu parçası döndürür

  • ContentResult - Görünüm gerektirmeden içeriği yanıt akışına yazar

  • FileContentResult - Bir dosyayı istemciye döndürür

  • FileStreamResult - İstemciye bir Akış tarafından sağlanan dosyayı döndürür

  • FilePathResult - Bir dosyayı istemciye döndürür

kaynaklar


5
ViewResult'u ActionResult üzerinden döndürmenin avantajı nedir - biraz daha semantik mi ve niyetinizi gösterir - ancak pratikte genellikle fark etmez mi?
niico

121

ActionResult soyut bir sınıftır.

ViewResult , ActionResult öğesinden türetilir . Diğer türetilmiş sınıflar arasında JsonResult ve PartialViewResult bulunur .

Bu şekilde beyan edersiniz, böylece polimorfizmden faydalanabilir ve farklı yöntemleri aynı yöntemle döndürebilirsiniz.

Örneğin:

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

2
Avantajı elde etmek için her zaman ActionResult'u döndürmemiz gerektiği anlamına gelir. Yoksa bunun bir sınırlaması veya yan etkisi var mı?
Adarsh ​​Kumar

5
@Adarsh ​​- C # 'daki herhangi bir soyut sınıfla aynı. Uygulamayı yöntem içinde kapsüllemek veya gelecekte türetilen diğer türler için API'nizi kanıtlamak istiyorsanız, bu şekilde bildirin. Değilse, betonu kullanın. Genellikle betonu kullanırım (ör. ViewResult veya JsonResult)
RPM1984

31

Aynı nedenle, "nesne" döndürmek için her sınıfın her yöntemini yazmıyorsunuz. Mümkün olduğunca spesifik olmalısınız. Bu, birim testleri yazmayı planlıyorsanız özellikle değerlidir. Artık dönüş tiplerini test etmek ve / veya sonucu yayınlamak yok.


Daha temiz kod ve birim testi, deneyimlerime dayanarak ViewResult'u kullanmanın yararıdır.
JoshYates1980

20

ViewResult, ActionResult'un bir alt sınıfıdır. View yöntemi bir ViewResult döndürür. Yani gerçekten bu iki kod parçacığı aynı şeyi yapıyor. Tek fark, ActionResult biriyle, kontrol cihazınızın bir görünüm döndürmeyi vaat etmemesi - yöntem tanımını değiştirmeden bir RedirectResult veya başka bir şeyi koşullu olarak döndürmek için yöntem gövdesini değiştirebilirsiniz.


11

Diğer yanıtlar farkları doğru bir şekilde not etmiş olsa da, aslında bir ViewResult döndürüyorsanız, temel ActionResult türünden ziyade yalnızca daha spesifik bir tür döndürmenin daha iyi olduğunu unutmayın. Bu ilkenin bariz bir istisnası, yönteminizin ActionResult öğesinden türeyen birden çok tür döndürmesi.

Bu ilkenin ardındaki nedenlerin tam bir tartışması için lütfen buradaki ilgili tartışmaya bakın: ASP.NET MVC Denetleyici Yöntemleri Geri Dönmeli ActionResult?


4

Denetleyicide aşağıdaki sözdizimi kullanılabilir

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

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

Yukarıdaki örnekte, yalnızca dönüş türü değişir. biri geri dönerken ViewResultdiğeri geri döner ActionResult.

ActionResult soyut bir sınıftır. Kabul edebilir:

ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult vb.

ViewResultBir alt sınıfıdır ActionResult.


4
Kastettiğinizin bu olup olmadığından emin değilim, ancak bu iki yönteme aynı anda sahip olamayacağınızı açıklığa kavuşturmak istiyorsanız, ad ve (no) parametreleri aynı olduğu için. Bir yöntemi yalnızca sonuç türünü değiştirerek aşırı yüklemek mümkün değildir.
Andrew

0

Denetleyici'de MVC'de 11 alt türü olabilen bir temel sınıf olan ActionResult ile aşağıdaki kodu belirttik: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult.

    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
    }

Benzer şekilde, her bir alt tür yöntemini açıkça belirtmeden ActionResult () kullanarak tüm bu 11 alt türü döndürebiliriz. Farklı görünüm türleri döndürüyorsanız, ActionResult en iyi şeydir.


0

Burada biraz zaman kazanmak için, https://forums.asp.net/t/1448398.aspx adresindeki önceki yanıttaki bir bağlantıdan gelen yanıt

ActionResult soyut bir sınıftır ve ViewResult sınıfı için temel sınıftır.

MVC çerçevesinde, action yönteminizin döndürdüğü nesneye başvurmak için ActionResult sınıfını kullanır. Ve üzerinde ExecuteResult yöntemini çağırır.

ViewResult da bu soyut sınıf için bir uygulamadır. Verilen görünüm adına göre önceden tanımlanmış bazı yollarda (/ views / controllername /, / views / shared /, vb.) Bir görünüm sayfası (genellikle aspx sayfası) bulmaya çalışır.

Yönteminizin daha spesifik bir sınıf döndürmesini sağlamak genellikle iyi bir uygulamadır. Dolayısıyla, eylem yönteminizin bir görünüm sayfası döndüreceğinden eminseniz ViewResult'u kullanabilirsiniz. Ancak, eylem yönteminizin bir görünüm oluşturma veya yeniden yönlendirme gerçekleştirme gibi farklı davranışları olabilir. Dönüş türü olarak daha genel temel sınıf ActionResult'u kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.