2012-07-12 17 views
10

Sto lavorando alla configurazione di un contenuto condiviso (navigazione) per una pagina di layout MVP asp.net.ASP.NET MVC 3 Vista parziale nella pagina di layout

Ecco la mia vista parziale "_LayoutPartial.cshtml" con codice per estrarre i dati di navigazione da un modello.

@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> 

Ecco come il codice per il mio controller "LayoutController.cs" assomiglia.

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); 
     } 

    } 
} 

Ecco il codice per la pagina "_Layout.cshtml". Sto tentando di chiamare la vista parziale qui usando il metodo Html.RenderAction (Action, Controller).

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

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

Quando la pagina di layout esegue la @ {Html.RenderAction ("Indice", "Layout");} linea, si getta fuori un messaggio di errore "Errore durante l'esecuzione richiesta figlio per handler 'System.Web.Mvc .HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'."

Cosa mi mancano gli amici? Come posso chiamare una vista parziale in una pagina di layout?

Grazie a tutti in anticipo!

+0

dov'è la tua visione parziale trova –

+0

~/Vista/Shared/_LayoutPartial.cshtml – Felasfaw

risposta

16

Invece di:

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

fare:

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

Se non fai che quando si torna una vista normale dalla vostra azione bambino, questo visualizzazione normale tenta di includere il layout, che a sua volta tenta di rendere l'azione figlio, che a sua volta restituisce una vista, che a sua volta include il Layout, che a sua volta tenta di rendere l'azione figlio, ... e finiamo con nomi come quello portato da questo stesso stesso sito.

Anche nel vostro parziale non è necessario eseguire la doppia codifica. La funzione @ Razor fa già la codifica HTML:

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

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

Lanci "riferimento oggetto non impostato a un'istanza di un oggetto." nella riga @foreach nel file di visualizzazione parziale. Sembra che l'oggetto navHeader venga fornito senza elementi. – Felasfaw

+1

Puoi anche scrivere '@ Html.Action (" Index, "Layout") 'invece di' @ {Html.RenderAction ("Index", "Layout");} 'anche se non so quale sia più veloce. –

6

Prima verificare che la vista del bambino si trova all'interno della directory Shared

@Html.Partial("_LayoutPartial") 

O

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

e non utilizzare @Html.Encode(), Razor sta già facendo per te. Basta usare

@item.Name 
@item.URL 
+0

Il primo oggetto Html.Partial genera "Riferimento oggetto non impostato su un'istanza di un oggetto" Errore Il secondo suggerimento genera il messaggio di errore che ho postato nel mio primo post. – Felasfaw

+0

Dove si trova la vista parziale, voglio dire che deve essere all'interno directory condivisa? –

+0

Sì la vista parziale si trova all'interno della directory condivisa. – Felasfaw

2

ho risolto questo errore ricevendo a pagina layout

System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper 

Importante! Prima creare vista parziale all'interno della cartella condivisa

Nel Controller,

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

nel layout di pagina,

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

Impressionante !!! questo ha funzionato per me ! Grande!! –

0

So che questa è una vecchia questione, ma ho pensato di gettare questo qui. È possibile utilizzare Html.Action o Html.RenderAction. Entrambi tecnicamente fanno la stessa cosa, ma a seconda di quanto il contenuto che stai restituendo può avere un impatto su quale si dovrebbe davvero utilizzare per la massima efficienza.

Entrambi i metodi consentono di chiamare un metodo di azione da una vista e generare i risultati dell'azione nella posizione all'interno della vista. La differenza tra i due è che Html.RenderAction renderà il risultato direttamente nella risposta (che è più efficiente se l'azione restituisce una grande quantità di HTML) mentre Html.Action restituisce una stringa con il risultato.

Source

Problemi correlati