Differenza tra ViewResult () e ActionResult ()


295

Qual è la differenza tra ViewResult()e ActionResult()in ASP.NET MVC?

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

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

12
Ottima domanda Ho visto un video e per creare unit test l'istruttore ha prima cambiato il tipo di ritorno dell'azione che stava per testare da ActionResult a ViewResult. Nessuna spiegazione .... Ero tipo "Cosa possiamo cambiare casualmente tipi? Senza spiegazioni"
Doug Chamberlain,

3
Probabilmente questa documentazione è utile :) msdn.microsoft.com/en-us/library/...
user3885927

Risposte:


372

ActionResult è una classe astratta che può avere diversi sottotipi.

Sottotipi di ActionResult

  • ViewResult : esegue il rendering di una vista specifica nel flusso di risposta

  • PartialViewResult : esegue il rendering di una vista parziale specificata nel flusso di risposta

  • EmptyResult : viene restituita una risposta vuota

  • RedirectResult - Esegue un reindirizzamento HTTP a un URL specificato

  • RedirectToRouteResult - Esegue un reindirizzamento HTTP a un URL determinato dal motore di routing, in base a dati di route dati

  • JsonResult : serializza un determinato oggetto ViewData in formato JSON

  • JavaScriptResult - Restituisce un pezzo di codice JavaScript che può essere eseguito sul client

  • ContentResult : scrive il contenuto nel flusso di risposta senza richiedere una vista

  • FileContentResult : restituisce un file al client

  • FileStreamResult : restituisce un file al client, fornito da uno stream

  • FilePathResult : restituisce un file al client

risorse


5
qual è il vantaggio di restituire ViewResult su ActionResult - è solo un po 'più semantico e mostra il tuo intento - ma in pratica di solito non fa differenza?
Niico,

121

ActionResult è una classe astratta.

ViewResult deriva da ActionResult . Altre classi derivate includono JsonResult e PartialViewResult .

Lo dichiari in questo modo in modo da poter sfruttare il polimorfismo e restituire tipi diversi nello stesso metodo.

per esempio:

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

2
Significa che dovremmo sempre restituire ActionResult in modo da trarne vantaggio. O c'è qualche limitazione o effetto collaterale di questo?
Adarsh ​​Kumar il

5
@Adarsh ​​- è lo stesso con qualsiasi classe astratta in C #. Dichiararlo in questo modo se si desidera incapsulare l'implementazione all'interno del metodo o si desidera in futuro provare l'API per altri tipi di caratteri derivati. In caso contrario, utilizzare il calcestruzzo. In genere uso il calcestruzzo (ad esempio ViewResult o JsonResult)
RPM1984

31

È per lo stesso motivo per cui non si scrive ogni metodo di ogni classe per restituire "oggetto". Dovresti essere il più specifico possibile. Ciò è particolarmente utile se hai intenzione di scrivere unit test. Non è più necessario testare i tipi di restituzione e / o trasmettere il risultato.


Un codice più pulito e test unitari sono il vantaggio di utilizzare ViewResult in base alla mia esperienza.
JoshYates1980,

20

ViewResult è una sottoclasse di ActionResult. Il metodo View restituisce un ViewResult. Quindi questi due frammenti di codice fanno esattamente la stessa cosa. L'unica differenza è che con ActionResult, il controller non promette di restituire una vista: è possibile modificare il corpo del metodo per restituire condizionalmente un RedirectResult o qualcos'altro senza modificare la definizione del metodo.


11

Mentre altre risposte hanno notato correttamente le differenze, si noti che se si sta effettivamente restituendo un ViewResult, è meglio restituire il tipo più specifico anziché il tipo ActionResult di base. Un'ovvia eccezione a questo principio è quando il metodo restituisce più tipi derivati ​​da ActionResult.

Per una discussione completa dei motivi alla base di questo principio, vedere la discussione correlata qui: I metodi del controller ASP.NET MVC devono restituire ActionResult?


4

Nel controller, è possibile utilizzare la sintassi seguente

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

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

Nell'esempio sopra, varia solo il tipo di ritorno. uno ritorna ViewResultmentre l'altro ritorna ActionResult.

ActionResult è una classe astratta. Può accettare:

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

Il ViewResultè una sottoclasse di ActionResult.


4
Non sono sicuro se questo è ciò che intendevi, ma nel caso volessi chiarire che non puoi avere questi due metodi contemporaneamente, poiché il loro nome e (no) parametri sono gli stessi. Non è possibile sovraccaricare un metodo cambiando solo il tipo di risultato.
Andrew,

0

In Controller ho specificato il codice seguente con ActionResult che è una classe base che può avere 11 sottotipi in MVC come: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileSathResult.

    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
    }

Allo stesso modo possiamo restituire tutti questi 11 sottotipi usando ActionResult () senza specificare esplicitamente ogni metodo di sottotipo. ActionResult è la cosa migliore se stai restituendo diversi tipi di visualizzazioni.


0

Per farti risparmiare un po 'di tempo ecco la risposta da un link in una precedente risposta su https://forums.asp.net/t/1448398.aspx

ActionResult è una classe astratta ed è la classe base per la classe ViewResult.

Nel framework MVC, utilizza la classe ActionResult per fare riferimento all'oggetto restituito dal metodo di azione. E invoca il metodo ExecuteResult su di esso.

E ViewResult è un'implementazione per questa classe astratta. Tenterà di trovare una pagina di visualizzazione (di solito pagina aspx) in alcuni percorsi predefiniti (/ views / controllerername /, / views / shared /, ecc.) In base al nome della vista specificato.

Di solito è buona norma fare in modo che il metodo restituisca una classe più specifica. Quindi, se sei sicuro che il tuo metodo di azione restituirà una pagina di visualizzazione, puoi usare ViewResult. Ma se il tuo metodo di azione può avere un comportamento diverso, come renderizzare una vista o eseguire un reindirizzamento. È possibile utilizzare la classe base più generale ActionResult come tipo restituito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.