Qual è la differenza tra ViewResult()
e ActionResult()
in ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Qual è la differenza tra ViewResult()
e ActionResult()
in ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Risposte:
ActionResult è una classe astratta che può avere diversi sottotipi.
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
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
}
È 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.
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.
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?
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 ViewResult
mentre 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
.
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.
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.