2015-06-19 13 views
5

In _Layout.cshtml è possibile determinare quale vista verrà resa in @RenderBody()?Determina quale vista verrà resa in @RenderBody()

+0

Di cosa hai bisogno esattamente? Non è chiaro cosa intendi. –

+0

Vuoi rendere diverse viste in base ad alcune condizioni? –

+0

@AndreiV diciamo che avere/Home/MyView Voglio ottenere "MyView" all'interno di _Layout.cshtml – gsharp

risposta

11

È possibile ottenere la vista (cioè Index.cshtml) attraverso ((RazorView)ViewContext.View).ViewPath

Esempio per le vostre esigenze:

<script type="text/javascript" src="~/Content/Scripts/@(Path.GetFileNameWithoutExtension(Server.MapPath(((RazorView)ViewContext.View).ViewPath))).js"></script> 

Se è necessario il reale Vista (cioè _Layout.cshtml), puoi invece usare VirtualPath.


Vecchio risposta leggere i vostri commenti, si desidera aggiungere un

<script ...>...</script> 

in base alla vista, ma al di fuori di @RenderBody()?

Poi mise

@RenderSection("Scripts", required:false) 

e nella vista definiscono la sezione come

@section Scripts { 
    <script ...>...</script> 
} 

Quindi non è necessario per mantenere il vostro _Layout.cshtml poiché ogni View definisce i propri script.

Ecco una spiegazione semplice: http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts-and-sections-with-razor

+0

So che posso farlo, ma non è quello che voglio .... Sto solo sperimentando su come includere index.js nella vista index.cshtml (e detail.js in detail.cshtml e così via ..) senza alcuna digitazione manuale. la mia idea era quella di inserire un pezzo di codice in _layout.cshtml che funzionasse per me ... e per questo ho bisogno di conoscere il punto di vista .. – gsharp

+1

Ho appena modificato la mia risposta. Quindi, questo, cosa vuoi ottenere? – Matt

+0

Ho letto @Matt risposta modificata e penso che questo sia il modo più semplice. –

0

Cosa si può fare è controllare Html.ViewContext.RouteData.Values. Questo è un dizionario con controller, azione e id (se necessario).

+0

Grazie per la risposta. Purtroppo ho bisogno di conoscere la vista e non l'azione. – gsharp

0

Leggi this articolo e sarà risolvere il tuo problema.

Modifica

RenderBody

cosa è RenderBody?

Nelle pagine di layout, rende la parte di una pagina di contenuto che non è all'interno di una sezione denominata. [MSDN]

Come funziona RenderBody (presentazione grafica)? enter image description here

+0

RenderBody() non ha alcun metodo sovraccarico, quindi ovviamente non puoi definire la vista che vuoi rendere. – Moh

0

Il @RenderBody() rende la vista controllata dal controllore. quindi se il tuo controller è così.

public class HomeController : Controller 
    { 
     public ActionResult Index() // Renders File /Views/Home/Index.cshtml 
     { 
      return View(); 
     } 

    } 

Poi il public ActionResult Index()Index.cshtml sarà la vista che renderà situato int cartella/Vista/Casa.

È possibile aggiungere all'indice .cshtml o _Layout.cshtml vista renderizzare altri Vista o partialViews Aggiungendo @Html.Partial("_MyView") come mostrato di seguito.

 @Html.Partial("_LayoutHeaderHeader") 
     @Html.Partial("_LayoutHeaderNavbar") 

A volte è facile impostare alcune pagine di layout per chiamare da Visualizzazioni diverse.

Se si desidera chiamare script per visualizzare, è necessario creare sempre una _PartialView e posizionare gli script nella vista parziale e chiamare tale vista nella parte inferiore della vista come @Html.Partial("_MyView") e gli script verranno impostati correttamente.

Ecco un buon tutorial. http://www.codeproject.com/Articles/698246/ASP-NET-MVC-Special-Views-Partial-View-and-Layout

+0

Ciao ricco. Non funzionerà perché puoi fare return View ("AnotherViewThatDoesntMatchTheActionName") – gsharp

+0

Mi scuso, quando leggo la domanda ho pensato che stavi cercando i dettagli per sapere quale vista è resa per default. –

0

Se si deriva tutti i modelli di un modello base, allora si potrebbe aggiungere una proprietà a voi modello di base che restituisce il nome del controller, che è possibile ottenere utilizzando

this.RouteData.Values["controller"].ToString();

Sarebbe ancora meglio se avevi una classe BaseController perché potresti metterla nella funzione di costruzione e non doverla mai più toccare.

Poiché si restituirebbe un discendente del modello di base alla pagina dell'indice che ha il nome del controllore, ora è possibile utilizzare una base di schema su @Model.ControllerName. Se il controller gestisce più viste, la proprietà potrebbe essere aggiornata per indicare un determinato nome di visualizzazione.

Non penso che si possa ottenere il nome di un partial all'interno dell'indice a meno che non si usi jquery e da quel momento le risorse della pagina siano già state caricate.

Modifica: Un altro trucco sarebbe quello di creare la propria versione della classe HtmlHelper @ Html.Partial(). Quindi hai @ Html.MyPartial ("ViewName") e all'interno di quel metodo chiama la funzione interna che genera Html.Partial e quindi le tue dipendenze.

+0

Aggiunto un altro trucco usando la classe HtmlHelper. –

0

EDIT: Ho appena letto i vostri commenti sul problema e penso che il modo migliore sia utilizzare lo snipplet di codice fornito da @Matt in un'altra risposta.

È possibile utilizzare l'istruzione @section all'interno della propria vista per informare quale script deve essere caricato.

layout del modello segnaposto

@RenderSection("scripts", required: false) 

Visualizza codice

@section scripts { 
    <script src="~/Scripts/custom-imgedit.js"></script> 
} 

L'esempio sopra informiamo che i custom-imgedit.js verranno caricati nel segnaposto sezione di rendering. Nota: puoi anche utilizzare pacchetti come @ Scripts.Render ("~/bundles/myCustomScripts")