2012-07-12 28 views
10

Estoy trabajando en la configuración de un contenido compartido (navegación) para una página de diseño MVC de asp.net.ASP.NET MVC 3 Vista parcial en la página de diseño

Aquí está mi vista parcial "_LayoutPartial.cshtml" con código para extraer datos de navegación de un modelo.

@model MyApp.Models.ViewModel.LayoutViewModel 
<p> 

    @foreach (var item in Model.navHeader) 
    { 
     //Test dump of navigation data 
     @Html.Encode(item.Name); 
     @Html.Encode(item.URL); 

    } 
</p> 

Así es como se ve el código de mi controlador "LayoutController.cs".

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MyApp.Models.ViewModel; 

namespace MyApp.Controllers 
{ 
    public class LayoutController : Controller 
    { 

     // 
     // GET: /Layout/ 

     LayoutViewModel layout = new LayoutViewModel(); 

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

    } 
} 

Aquí está el código para la página "_Layout.cshtml". Estoy intentando llamar a la vista parcial aquí usando el método Html.RenderAction (Acción, Controlador).

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
</head> 
<body> 
    <p> 
     @{Html.RenderAction("Index","Layout");} 
    </p> 

    @RenderBody() 
</body> 
</html> 

Cuando el diseño de la página ejecuta el @ {Html.RenderAction ("Índice", "Diseño");} línea, se lanza un mensaje de error "Error al ejecutar solicitud secundaria para el manejador 'System.Web.Mvc .HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper '. "

¿Qué estoy perdiendo amigos? ¿Cómo puedo llamar una vista parcial en una página de diseño?

¡Gracias a todos por adelantado!

+0

¿Dónde está su vista parcial situado –

+0

~/Views/Shared/_LayoutPartial.cshtml – Felasfaw

Respuesta

16

En lugar de:

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

hacer:

public ActionResult Index() 
{ 
    return PartialView(layout); 
} 

Si no hace eso cuando regrese una vista normal a partir de la acción del niño, esta visión normal de los intentos de incluir el diseño, que a su vez intenta hacer que la acción del niño, que a su vez devuelve una vista, que a su vez incluye el diseño, que a su vez intenta hacer que el niño actúe, ... y terminamos con nombres como el que porta este mismo mismo sitio.

También en su parcialidad no es necesario hacer doble codificación. La función @ Razor ya lo hace de codificación HTML:

@model MyApp.Models.ViewModel.LayoutViewModel 
<p> 

    @foreach (var item in Model.navHeader) 
    { 
     @item.Name 
     @item.URL 
    } 
</p> 
+1

Lanza "Referencia a objeto no establecida como instancia de un objeto." en la línea @foreach en el archivo de vista parcial. Parece que el objeto navHeader viene sin elementos. – Felasfaw

+1

También puede simplemente escribir '@ Html.Action (" Index, "Layout") 'en lugar de' @ {Html.RenderAction ("Index", "Layout");} 'aunque no sé cuál es más rápido. –

6

Primero verifique que su hijo es vista dentro del directorio Shared

@Html.Partial("_LayoutPartial") 

O

@{Html.RenderAction("actionname", "controller name");} 

y no utilice @Html.Encode(), la maquinilla de afeitar ya está haciendo por ti. Sólo tiene que utilizar

@item.Name 
@item.URL 
+0

El primer Html.Partial arroja "La referencia del objeto no está configurada para una instancia de un objeto" Error. La segunda sugerencia arroja el mensaje de error que publiqué en mi primera publicación. – Felasfaw

+0

¿Dónde está ubicada su vista parcial, quiero decir que debe estar dentro directorio compartido? –

+0

Sí, la vista parcial se encuentra dentro del directorio compartido. – Felasfaw

2

He resuelto este error al obtener en la página Disposición

System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper 

Importante! primero cree vista parcial dentro de la carpeta compartida

En Controlador,

public PartialViewResult Userdetails() 
{ 
    .... 
    return PartialView("PartialViewName", obj); 
} 

En Diseño de página,

@{Html.RenderAction("action","controller");} 
+0

¡Esto me funcionó! ! ¡¡Excelente!! –

0

Sé que esto es una vieja pregunta, pero pensé que iba a tirar esto aquí. Puede usar Html.Action o Html.RenderAction. Ambos hacen técnicamente lo mismo, pero dependiendo de la cantidad de contenido que regreses puede tener un impacto sobre cuál deberías usar realmente para obtener la mejor eficiencia.

Ambos métodos le permiten llamar a un método de acción desde una vista y mostrar los resultados de la acción en el lugar dentro de la vista. La diferencia entre los dos es que Html.RenderAction mostrará el resultado directamente a la Respuesta (que es más eficiente si la acción arroja una gran cantidad de HTML), mientras que Html.Action devuelve una cadena con el resultado.

Source

Cuestiones relacionadas