2010-04-18 25 views

Respuesta

26

Volver View() - Renders un .aspx | .cshtml página

  • Renders una página normal .aspx que también puede Vistas parciales contener

Volver PartialView() - Renders Ascx | control de .cshtml

  • Representa un segmento de HTML en el navegador que se puede solicitar a través de solicitudes AJAX o no AJAX.

Ver() devuelve ViewResult PartialView() devuelve PartialViewResult tanto heredar de ViewResultBase

La diferencia es descrita por debajo Reflector ...

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

estaría downvote si pudiera, pero ReturnView() vs View() no tiene absolutamente nada que ver con si se representa una vista ".aspx" o ".ascx". CORRECCIÓN: parece que, de hecho, puede manejar qué vista se obtiene usando la convención (es decir, el controlador representa la vista del mismo nombre). independientemente, puede alimentar tanto una vista .aspx como una vista .ascx a PartialView() sin problemas. – kdawg

+3

'View()' devuelve un 'ViewResult' y PartialView() devuelve un' PartialViewResult'. Ejecuta Reflector en los dos métodos para ti y mira cuál debes usar para decidir qué renderizar. 'PartialViewResult' y' ViewResult' son dos clases diferentes que ambos heredan de 'ViewResultBase', ¡que están destinados a diferentes propósitos! PartialViews no tiene MasterPages (Views can), ¿realmente va a renderizar "' somecontrol.ascx' "usando' View() '... – xandercoded

1

Una acción del controlador generalmente devuelve un Vista parcial cuando se utiliza AJAX, y se realiza una actualización de la región de la página representada por la vista parcial. La forma normal de usar vistas parciales es simplemente llamar al Html.RenderPartial dentro de su vista principal.

14

return PartialView() devuelve el fragmento de código HTML y se utiliza con ViewUserControls - archivos ASCX. La principal ventaja de usar "return PartialView()" es cuando no desea representar todas las demás cosas de la página HTML, como etiquetas HTML, BODY, HEAD.

Uno de los usos más comunes que hago es cuando quiero representar solo el control del usuario en función de si la solicitud de una acción es una llamada AJAX.

Así que tengo una vista llamada MyControl.aspx donde uso RenderPartial HTML helper y tengo una vista parcial llamada MyControl.ascx donde realizo el renderizado.

puedo cambiar entre los dos en mi acción del controlador de esta manera:

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

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