2013-04-10 22 views
8

Desidero visualizzare un conteggio di elementi selezionati in ogni pagina del mio sito MVC. Ho un ViewModel che definisce le proprietà che voglio lìMVC 4 _Layout.cshtml viewmodel

public class CartViewModel 
{ 
    public List<CartItem> CartItems { get; set; } 
    public decimal CartTotal { get; set; } 
} 

un controller che ottiene la spesa, mappe per il modello di visualizzazione e passa che in

public ActionResult GetCartSummary() 
{ 
    var cart = Cart.Instance; 
    var viewModel = AutoMapper.Mapper.Map<Cart, CartViewModel>(cart); 
    return View(viewModel); 
} 

e una vista per quella

@model TheWorkshop.Web.Models.Edit.ShoppingCartViewModel 

<h2>Cart Summary</h2> 
<span>@Model.CartTotal</span> 

e, infine, nel mio file _Layout.cshtml

@Html.Action("GetCartSummary", "Cart") 

Ma questo mi dà

System.StackOverflowException era gestita

risposta

6

Prova ad aggiungere quanto segue al esamina il carrello:

@{Layout = null;} 
+1

Molto bello, questo è co rrect. Le visualizzazioni sono ricorsive. –

+0

Funziona bene; non avrebbe mai immaginato che fossero le viste ricorsive –

3

Prova di restituire un PartialView invece di Vista:

public ActionResult GetCartSummary() 
{ 
    var cart = Cart.Instance; 
    var viewModel = AutoMapper.Mapper.Map<Cart, CartViewModel>(cart); 
    return PartialView(viewModel); 
} 
+0

Questo funzionerà anche perché 'PartialView' imposta implicitamente' Layout = null'. –

+0

Qualcuno mi ha detto di usare solo una vista parziale se è necessario usarlo altrove. È un approccio consigliato? –

+0

È possibile utilizzare PartialView ogni volta che si annida una vista in un'altra vista, poiché altrimenti si otterranno tutti i materiali del layout che circondano la posizione in cui la vista è nidificata. Cioè l'intestazione Menu/LOGO verrà duplicata e avrà un aspetto terribile. – AaronLS