2010-04-18 8 views

risposta

26

ritorno View() - Renders un aspx | .cshtml pagina

  • Renders una pagina aspx normale che può anche contenere parziali Visualizzazioni

ritorno PartialView() - Rende .ascx | controllo .cshtml

  • Rende un segmento di HTML al browser che può essere richiesto allo stesso modo tramite richieste AJAX o Non-AJAX.

View() restituisce ViewResult PartialView() restituisce PartialViewResult sia ereditare da ViewResultBase

La differenza è descritto da Reflector qui di seguito ...

public class PartialViewResult : ViewResultBase 
{ 
    // Methods 
    protected override ViewEngineResult FindView(ControllerContext context) 
    { 
     ViewEngineResult result = base.ViewEngineCollection.FindPartialView(context, base.ViewName); 
     if (result.View != null) 
     { 
     return result; 
     } 
     StringBuilder builder = new StringBuilder(); 
     foreach (string str in result.SearchedLocations) 
     { 
     builder.AppendLine(); 
     builder.Append(str); 
     } 
     throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.Common_PartialViewNotFound, new object[] { base.ViewName, builder })); 
    } 
} 


public class ViewResult : ViewResultBase 
{ 
    // Fields 
    private string _masterName; 

    // Methods 
    protected override ViewEngineResult FindView(ControllerContext context) 
    { 
     ViewEngineResult result = base.ViewEngineCollection.FindView(context, base.ViewName, this.MasterName); 
     if (result.View != null) 
     { 
     return result; 
     } 
     StringBuilder builder = new StringBuilder(); 
     foreach (string str in result.SearchedLocations) 
     { 
     builder.AppendLine(); 
     builder.Append(str); 
     } 
     throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.Common_ViewNotFound, new object[] { base.ViewName, builder })); 
    } 

    // Properties 
    public string MasterName 
    { 
     get 
     { 
     return (this._masterName ?? string.Empty); 
     } 
     set 
     { 
     this._masterName = value; 
     } 
    } 
} 
+4

mi piacerebbe downvote se potessi, ma ReturnView() vs View() non ha assolutamente nulla a che fare con il rendering di una vista ".aspx" o ".ascx". CORREZIONE: sembra che possa effettivamente gestire quale vista viene recuperata usando la convenzione (ad esempio, il controller rende la visualizzazione dello stesso nome). a prescindere, puoi alimentare sia una vista .aspx che una .ascx a PartialView() senza problemi. – kdawg

+3

'View()' restituisce un 'ViewResult' e PartialView() restituisce un' PartialViewResult'. Esegui Reflector sui due metodi per te stesso e vedi quale usare quando decidi cosa eseguire il rendering. 'PartialViewResult' e' ViewResult' sono due classi diverse che entrambi ereditano da 'ViewResultBase', che sono destinati a scopi diversi! PartialViews non ha MasterPages (le viste possono), stai davvero andando a rendere "' somecontrol.ascx' "usando' View() '... – xandercoded

1

Un'azione del controller restituisce in genere un oggetto PartialView quando viene utilizzato AJAX e viene eseguito un aggiornamento dell'area della pagina rappresentata dalla vista parziale. Il modo normale di usare viste parziali è semplicemente chiamare Html.RenderPartial all'interno della tua vista principale.

14

return PartialView() restituisce il frammento di codice HTML ed è utilizzato con ViewUserControls - file ASCX. Il vantaggio principale dell'utilizzo di "return PartialView()" è quando non si desidera rendere tutte le altre cose della pagina HTML, come i tag HTML, BODY, HEAD.

Uno degli usi più comuni da parte mia è quando voglio eseguire il rendering del controllo utente in base al fatto che la richiesta di un'azione sia chiamata AJAX.

Quindi ho una vista denominata MyControl.aspx in cui utilizzo l'helper HTML di RenderPartial e ho una vista parziale denominata MyControl.ascx in cui eseguo il rendering effettivo.

posso passare tra quei due nella mia azione di controllo in questo modo:

if (Request.IsAjaxRequest()) 
    return PartialView("MyControl"); // this renders MyControl.ascx 

return View(); // this render MyControl.aspx 
Problemi correlati